閑來(lái)沒(méi)事衅澈,便試著測(cè)試了下golang的鎖的性能兢哭。代碼如下:
package main
import (
"fmt"
"os"
"strconv"
"sync"
"time"
)
var lock sync.Mutex
var count = 1
func work() {
for {
lock.Lock()
count++
lock.Unlock()
}
}
func main() {
nthread := 1
if len(os.Args) > 1 {
nthread, _ = strconv.Atoi(os.Args[1])
}
for i := 0; i < nthread; i++ {
go work()
}
old := 0
last := time.Now()
for {
time.Sleep(time.Second)
lock.Lock()
k := count
lock.Unlock()
now := time.Now()
fmt.Println(int(float64(k-old) / (float64(now.UnixNano()-last.UnixNano()) / 1e9)))
old = k
last = now
}
}
測(cè)試結(jié)果:
競(jìng)爭(zhēng)的協(xié)程數(shù) | 每秒總的lock次數(shù) |
---|---|
1 | 5千萬(wàn) |
2 | 2.8千萬(wàn) |
4 | 9百萬(wàn) |
10 | 6百萬(wàn) |
100 | 5百萬(wàn) |
1000 | 5百萬(wàn) |
10000 | 5百萬(wàn) |
100000 | 5百萬(wàn) |
1000000 | 5百萬(wàn) |