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:
parent
27032fddee
commit
e8018fbebe
@ -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");
|
||||
|
@ -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))
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user