最近在用 Go 的并发基准测试框架时,发现了一些坑。比如以下代码1,执行基准测试,结果发现,随着并发度越高 b.SetParallelism(i)
,ns/op 数值越小。然而我要做基准测试的函数,是 sleep 1ms,并无任何并发优化。要想理解为什么随着并发度翻倍,ns/op 结果减半,需要看看 Go benchmark 源码是如何计算 ns/op 的。
|
|
|
|
|
|
从源码中可知,ns/op 的计算方式为,总时间 / 总迭代次数(r.T.Nanoseconds() / r.N)。显然,总迭代次数会随并发数翻倍而翻倍,导致 ns/op 下降一半。所以,做并发基准测试时,需要注意有这个坑,ns/op 可能并不准确。