]> Cypherpunks repositories - gostls13.git/commitdiff
expvar: parallelize BenchmarkMapAdd{Same,Different}
authorBryan C. Mills <bcmills@google.com>
Thu, 9 Feb 2017 23:39:16 +0000 (18:39 -0500)
committerBryan Mills <bcmills@google.com>
Fri, 10 Feb 2017 17:37:14 +0000 (17:37 +0000)
The other expvar tests are already parallelized, and this will help to
measure the impact of potential implementations for #18177.

updates #18177

Change-Id: I0f4f1a16a0285556cbcc8339855b6459af412675
Reviewed-on: https://go-review.googlesource.com/36717
Reviewed-by: Russ Cox <rsc@golang.org>
src/expvar/expvar_test.go

index 0efa8643c0b72fb2c52abd039f0aec05f878ce62..f802cfd37e360c42e9873a648dfd22092e5d3c3e 100644 (file)
@@ -7,12 +7,14 @@ package expvar
 import (
        "bytes"
        "encoding/json"
+       "fmt"
        "net"
        "net/http/httptest"
        "reflect"
        "runtime"
        "strconv"
        "sync"
+       "sync/atomic"
        "testing"
 )
 
@@ -219,23 +221,42 @@ func BenchmarkMapSet(b *testing.B) {
 }
 
 func BenchmarkMapAddSame(b *testing.B) {
-       for i := 0; i < b.N; i++ {
-               m := new(Map).Init()
-               m.Add("red", 1)
-               m.Add("red", 1)
-               m.Add("red", 1)
-               m.Add("red", 1)
-       }
+       m := new(Map).Init()
+       b.ResetTimer()
+
+       b.RunParallel(func(pb *testing.PB) {
+               for pb.Next() {
+                       m.Add("red", 1)
+               }
+       })
 }
 
 func BenchmarkMapAddDifferent(b *testing.B) {
-       for i := 0; i < b.N; i++ {
-               m := new(Map).Init()
-               m.Add("red", 1)
-               m.Add("blue", 1)
-               m.Add("green", 1)
-               m.Add("yellow", 1)
+       procKeys := make([][]string, runtime.GOMAXPROCS(0))
+       for i := range procKeys {
+               keys := make([]string, 4)
+               for j := range keys {
+                       keys[j] = fmt.Sprint(i, j)
+               }
+               procKeys[i] = keys
        }
+
+       m := new(Map).Init()
+       b.ResetTimer()
+
+       var n int32
+       b.RunParallel(func(pb *testing.PB) {
+               i := int(atomic.AddInt32(&n, 1)-1) % len(procKeys)
+               keys := procKeys[i]
+               j := 0
+
+               for pb.Next() {
+                       m.Add(keys[j], 1)
+                       if j++; j == len(keys) {
+                               j = 0
+                       }
+               }
+       })
 }
 
 func TestFunc(t *testing.T) {