func BenchmarkMutex(b *testing.B) { var number int lock := sync.Mutex{} for i:=0; i< b.N;i++{ go func() { defer lock.Unlock() lock.Lock() number++ }() } } func BenchmarkAtomic(b *testing.B) { var number int32 for i:=0; i< b.N;i++{ go func() { atomic.AddInt32(&number, 1) }() } }
用兩個函數做性能測試 benchmarkMutex與benchmarkAtomic 來比較互斥鎖的差異
$ go test -v -cpu 1,2,4 -benchmem -bench=. goos: darwin goarch: amd64 pkg: puzzlers/article21/q3 BenchmarkMutex 1000000 2949 ns/op 424 B/op 0 allocs/op BenchmarkMutex-2 5000000 336 ns/op 22 B/op 0 allocs/op BenchmarkMutex-4 10000000 205 ns/op 0 B/op 0 allocs/op BenchmarkAtomic 2000000 1745 ns/op 156 B/op 0 allocs/op BenchmarkAtomic-2 10000000 176 ns/op 0 B/op 0 allocs/op BenchmarkAtomic-4 10000000 225 ns/op 0 B/op 0 allocs/op PASS ok puzzlers/article21/q3 26.179s
我們發現原子鎖的性能高於互斥鎖 不管從內存消耗與CPU運行 都比互斥鎖要好