// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. 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) }