From: Russ Cox Date: Wed, 31 Jul 2013 12:35:43 +0000 (-0400) Subject: runtime: rewrite map size test X-Git-Tag: go1.2rc2~870 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=e8018fbebe2e6e86f94111b21c5749ebeea15dbd;p=gostls13.git 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 --- diff --git a/src/pkg/runtime/hashmap.c b/src/pkg/runtime/hashmap.c index 7e0c9572dd..4b51436dc2 100644 --- a/src/pkg/runtime/hashmap.c +++ b/src/pkg/runtime/hashmap.c @@ -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"); diff --git a/src/pkg/runtime/map_test.go b/src/pkg/runtime/map_test.go index 0e36bb2d34..9f9c40d156 100644 --- a/src/pkg/runtime/map_test.go +++ b/src/pkg/runtime/map_test.go @@ -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)) -}