| | |
| | |
| | |
| |
|
| | package sync_test |
| |
|
| | import ( |
| | "runtime" |
| | . "sync" |
| | "testing" |
| | ) |
| |
|
| | func BenchmarkSemaUncontended(b *testing.B) { |
| | type PaddedSem struct { |
| | sem uint32 |
| | pad [32]uint32 |
| | } |
| | b.RunParallel(func(pb *testing.PB) { |
| | sem := new(PaddedSem) |
| | for pb.Next() { |
| | Runtime_Semrelease(&sem.sem, false, 0) |
| | Runtime_Semacquire(&sem.sem) |
| | } |
| | }) |
| | } |
| |
|
| | func benchmarkSema(b *testing.B, block, work bool) { |
| | if b.N == 0 { |
| | return |
| | } |
| | sem := uint32(0) |
| | if block { |
| | done := make(chan bool) |
| | go func() { |
| | for p := 0; p < runtime.GOMAXPROCS(0)/2; p++ { |
| | Runtime_Semacquire(&sem) |
| | } |
| | done <- true |
| | }() |
| | defer func() { |
| | <-done |
| | }() |
| | } |
| | b.RunParallel(func(pb *testing.PB) { |
| | foo := 0 |
| | for pb.Next() { |
| | Runtime_Semrelease(&sem, false, 0) |
| | if work { |
| | for i := 0; i < 100; i++ { |
| | foo *= 2 |
| | foo /= 2 |
| | } |
| | } |
| | Runtime_Semacquire(&sem) |
| | } |
| | _ = foo |
| | Runtime_Semrelease(&sem, false, 0) |
| | }) |
| | } |
| |
|
| | func BenchmarkSemaSyntNonblock(b *testing.B) { |
| | benchmarkSema(b, false, false) |
| | } |
| |
|
| | func BenchmarkSemaSyntBlock(b *testing.B) { |
| | benchmarkSema(b, true, false) |
| | } |
| |
|
| | func BenchmarkSemaWorkNonblock(b *testing.B) { |
| | benchmarkSema(b, false, true) |
| | } |
| |
|
| | func BenchmarkSemaWorkBlock(b *testing.B) { |
| | benchmarkSema(b, true, true) |
| | } |
| |
|