1
0
mirror of https://github.com/golang/go synced 2024-11-19 15:34:47 -07:00

sync: add benchmark for Once.

R=r, rsc
CC=golang-dev
https://golang.org/cl/4650054
This commit is contained in:
Dmitriy Vyukov 2011-06-27 16:02:13 -04:00 committed by Russ Cox
parent 6bcfb95168
commit 3a4a581c49

View File

@ -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) {
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
}
}