Commit 3a4a581c authored by Dmitriy Vyukov's avatar Dmitriy Vyukov Committed by Russ Cox

sync: add benchmark for Once.

R=r, rsc
CC=golang-dev
https://golang.org/cl/4650054
parent 6bcfb951
...@@ -6,6 +6,8 @@ package sync_test ...@@ -6,6 +6,8 @@ package sync_test
import ( import (
. "sync" . "sync"
"sync/atomic"
"runtime"
"testing" "testing"
) )
...@@ -35,3 +37,26 @@ func TestOnce(t *testing.T) { ...@@ -35,3 +37,26 @@ func TestOnce(t *testing.T) {
t.Errorf("once failed: %d is not 1", *o) 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
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment