Skip to content

Instantly share code, notes, and snippets.

@TheHippo
Created August 15, 2015 02:22
Show Gist options
  • Save TheHippo/75babf83556dc6f638a4 to your computer and use it in GitHub Desktop.
Save TheHippo/75babf83556dc6f638a4 to your computer and use it in GitHub Desktop.
Benchmarking Go Mutex overhead
package main
import (
"fmt"
"sync"
)
type unlocked struct {
i int
}
type locked struct {
i int
l sync.Mutex
}
func (c *unlocked) add() {
c.i++
}
func (c *locked) add() {
c.l.Lock()
defer c.l.Unlock()
c.i++
}
func main() {
fmt.Println("ok")
}
package main
import "testing"
func TestLocked_add(t *testing.T) {
c := locked{}
c.add()
if c.i != 1 {
t.Errorf("Expected 1 but got %d", c.i)
}
}
func BenchmarkLocked_add(t *testing.B) {
c := locked{}
for i := 0; i < t.N; i++ {
c.add()
}
if c.i != t.N {
t.Errorf("Expected %d, but got %d", t.N, c.i)
}
}
func TestUnlocked_add(t *testing.T) {
c := unlocked{}
c.add()
if c.i != 1 {
t.Errorf("Expected 1 but got %d", c.i)
}
}
func BenchmarkUnlocked_add(t *testing.B) {
c := unlocked{}
for i := 0; i < t.N; i++ {
c.add()
}
if c.i != t.N {
t.Errorf("Expected %d, but got %d", t.N, c.i)
}
}
$ go test -v -bench .
=== RUN TestLocked_add
--- PASS: TestLocked_add (0.00s)
=== RUN TestUnlocked_add
--- PASS: TestUnlocked_add (0.00s)
PASS
BenchmarkLocked_add 10000000 143 ns/op
BenchmarkUnlocked_add 1000000000 2.41 ns/op
ok _/home/hippo/test/mutex-bench 4.226s
@AlexanderYastrebov
Copy link

For those coming from internet: this benchmarks nothing fastpath that is atomic CAS because benchmark does not access mutex in parallel.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment