1
0
mirror of https://github.com/golang/go synced 2024-11-18 09:04:49 -07:00

runtime: rewrite map size test

I don't know why the memstats code is flaky.

TBR=bradfitz
CC=golang-dev
https://golang.org/cl/12160043
This commit is contained in:
Russ Cox 2013-07-31 08:35:43 -04:00
parent 27032fddee
commit e8018fbebe
2 changed files with 3 additions and 41 deletions

View File

@ -1112,6 +1112,9 @@ runtime·makemap_c(MapType *typ, int64 hint)
Type *key;
key = typ->key;
if(sizeof(Hmap) > 48)
runtime·panicstring("hmap too large");
if(hint < 0 || (int32)hint != hint)
runtime·panicstring("makemap: size out of range");

View File

@ -371,44 +371,3 @@ func testMapLookups(t *testing.T, m map[string]string) {
}
}
}
func TestMapSize(t *testing.T) {
if runtime.GOMAXPROCS(-1) != 1 {
t.Skip("gomaxprocs > 1 - not accurate")
}
var m map[struct{}]struct{}
size := bytesPerRun(100, func() {
m = make(map[struct{}]struct{})
})
if size > 48 {
t.Errorf("size = %v; want <= 48", size)
}
}
// like testing.AllocsPerRun, but for bytes of memory, not number of allocations.
func bytesPerRun(runs int, f func()) (avg float64) {
defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(1))
// Warm up the function
f()
// Measure the starting statistics
var memstats runtime.MemStats
runtime.ReadMemStats(&memstats)
sum := 0 - memstats.Alloc
// Run the function the specified number of times
for i := 0; i < runs; i++ {
f()
}
// Read the final statistics
runtime.ReadMemStats(&memstats)
sum += memstats.Alloc
// Average the mallocs over the runs (not counting the warm-up).
// We are forced to return a float64 because the API is silly, but do
// the division as integers so we can ask if AllocsPerRun()==1
// instead of AllocsPerRun()<2.
return float64(sum / uint64(runs))
}