1 回答

TA貢獻(xiàn)1815條經(jīng)驗 獲得超6個贊
你做的基準(zhǔn)測試是錯誤的。引用包文檔testing:
示例基準(zhǔn)函數(shù)如下所示:
func BenchmarkHello(b *testing.B) {
for i := 0; i < b.N; i++ {
fmt.Sprintf("hello")
}
}
基準(zhǔn)函數(shù)必須運行目標(biāo)代碼 bN 次。 在基準(zhǔn)執(zhí)行期間,調(diào)整 bN 直到基準(zhǔn)函數(shù)持續(xù)足夠長的時間以可靠地計時。
也不要fmt.PrintXX()在基準(zhǔn)代碼中包含調(diào)用,您會扭曲結(jié)果。
而是對這些函數(shù)進(jìn)行基準(zhǔn)測試:
func newDummy() {
one := make(chan string, 1)
two := make(chan string, 1)
var wg sync.WaitGroup
wg.Add(2)
go doWork(&wg, one)
go doWork(&wg, two)
wg.Wait()
<-one
<-two
}
func doWork(wg *sync.WaitGroup, one chan string) {
defer wg.Done()
one <- "hell0"
}
func newDummy2() {
one, two := "", ""
var wg sync.WaitGroup
wg.Add(2)
var mu sync.Mutex
go func() {
mu.Lock()
defer mu.Unlock()
defer wg.Done()
one = "hello"
}()
go func() {
mu.Lock()
defer mu.Unlock()
defer wg.Done()
two = "hello"
}()
wg.Wait()
_, _ = one, two
}
像這樣:
func BenchmarkNewDummy(b *testing.B) {
for i := 0; i < b.N; i++ {
newDummy()
}
}
func BenchmarkNewDummy2(b *testing.B) {
for i := 0; i < b.N; i++ {
newDummy2()
}
}
對其進(jìn)行基準(zhǔn)測試:
go test -bench . -benchmem
我得到這樣的輸出:
BenchmarkNewDummy-4 605662 1976 ns/op 240 B/op 5 allocs/op
BenchmarkNewDummy2-4 927031 1627 ns/op 56 B/op 4 allocs/op
從結(jié)果來看,newDummy()平均執(zhí)行 5 次分配,總計 250 字節(jié)。newDummy2()執(zhí)行 4 次分配,總共 56 個字節(jié)。
- 1 回答
- 0 關(guān)注
- 144 瀏覽
添加回答
舉報