]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: faster range on empty map
authorFrederick Kelly Mayle III <frederickmayle@gmail.com>
Thu, 23 May 2013 21:17:52 +0000 (14:17 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 23 May 2013 21:17:52 +0000 (14:17 -0700)
benchmark                old ns/op    new ns/op    delta
BenchmarkMapIter               191          190   -0.52%
BenchmarkMapIterEmpty           22            4  -78.96%

R=golang-dev, minux.ma, dvyukov, iant, khr
CC=golang-dev
https://golang.org/cl/9637043

src/pkg/runtime/hashmap.c
src/pkg/runtime/mapspeed_test.go

index 892f0a1700c06c542385f5ed463cea79863d6b40..959d6bc760236e671383293a8c7cae671f4bd925 100644 (file)
@@ -1355,7 +1355,7 @@ reflect·mapassign(MapType *t, Hmap *h, uintptr key, uintptr val, bool pres)
 void
 runtime·mapiterinit(MapType *t, Hmap *h, struct hash_iter *it)
 {
-       if(h == nil) {
+       if(h == nil || h->count == 0) {
                it->key = nil;
                return;
        }
index a737c65dc68713cdc1a5e960517db980c13935ea..13b57621d433d3276fcbdc5183cb93806f2575ba 100644 (file)
@@ -233,3 +233,24 @@ func BenchmarkNewEmptyMap(b *testing.B) {
                _ = make(map[int]int)
        }
 }
+
+func BenchmarkMapIter(b *testing.B) {
+       m := make(map[int]bool)
+       for i := 0; i < 8; i++ {
+               m[i] = true
+       }
+       b.ResetTimer()
+       for i := 0; i < b.N; i++ {
+               for _, _ = range m {
+               }
+       }
+}
+
+func BenchmarkMapIterEmpty(b *testing.B) {
+       m := make(map[int]bool)
+       b.ResetTimer()
+       for i := 0; i < b.N; i++ {
+               for _, _ = range m {
+               }
+       }
+}