]> Cypherpunks repositories - gostls13.git/commitdiff
sync: add benchmark for Once.
authorDmitriy Vyukov <dvyukov@google.com>
Mon, 27 Jun 2011 20:02:13 +0000 (16:02 -0400)
committerRuss Cox <rsc@golang.org>
Mon, 27 Jun 2011 20:02:13 +0000 (16:02 -0400)
R=r, rsc
CC=golang-dev
https://golang.org/cl/4650054

src/pkg/sync/once_test.go

index 155954a49b59b245317663608a086987ed04286f..157a3667a64e396c8d78df9954d29d70f39ead7f 100644 (file)
@@ -6,6 +6,8 @@ package sync_test
 
 import (
        . "sync"
+       "sync/atomic"
+       "runtime"
        "testing"
 )
 
@@ -35,3 +37,26 @@ func TestOnce(t *testing.T) {
                t.Errorf("once failed: %d is not 1", *o)
        }
 }
+
+func BenchmarkOnce(b *testing.B) {
+       const CallsPerSched = 1000
+       procs := runtime.GOMAXPROCS(-1)
+       N := int32(b.N / CallsPerSched)
+       var once Once
+       f := func() {}
+       c := make(chan bool, procs)
+       for p := 0; p < procs; p++ {
+               go func() {
+                       for atomic.AddInt32(&N, -1) >= 0 {
+                               runtime.Gosched()
+                               for g := 0; g < CallsPerSched; g++ {
+                                       once.Do(f)
+                               }
+                       }
+                       c <- true
+               }()
+       }
+       for p := 0; p < procs; p++ {
+               <-c
+       }
+}