我正在尝试在Go语言中对基准测试进行实验,我有一个简单的函数,只是休眠5纳秒,但是当我运行基准测试时,它显示 298.1 ns/op
。 我很好奇为什么会这样。难道不应该是5ns/op
吗?
Go版本:
go version go1.19 linux/amd64
代码:
package andrei
import (
"testing"
"time"
)
func Hi() {
time.Sleep(5 * time.Nanosecond)
}
func BenchmarkHi(b *testing.B) {
for i := 0; i < b.N; i++ {
Hi()
}
}
结果:
$ go test -run none -bench . -benchmem ./andrei
goos: linux
goarch: amd64
pkg: andrei/andrei
cpu: 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz
BenchmarkHi-8 3861392 298.1 ns/op 0 B/op 0 allocs/op
PASS
ok andrei/andrei 1.470s
rdtsc
吞吐量约为27个周期(https://uops.info/),因此在最大睿频4.7 GHz下,每5.7 ns左右就会发生一次。但是你可以肯定,单独的time.Sleep
调用需要做的不仅仅是检查当前时间戳计数器一次! - Peter Cordes