我正在对我在Go中创建的软件库进行基准测试,我遇到了运行时和ns/op之间的不协调。我是基准测试的新手,Go的文档和过去的stackoverflow问题在概念上并没有深入涵盖基准测试,所以我正在寻找比我更有概念知识的人来帮助我(以及其他处于类似困境的Stackoveflow用户(了解到底发生了什么。
使用本机Go执行任务的基准输出:
1000000000 0.6136 ns/op 0 B/op 0 allocs/op
PASS
ok github.com/gabetucker2/gostack/benchmark 0.862s
使用我的软件库执行相同任务的基准测试输出:
1576087 805.3 ns/op 544 B/op 21 allocs/op
PASS
ok github.com/gabetucker2/gostack/benchmark 2.225s
注意两件事:
- 我的软件库的ns/op大约比原生Go的ns/op慢1200倍
- 我的软件库的运行时间大约是原生Go的运行时间的2倍
在我看来,我的软件库中的一个非常简单的函数应该比原生Go代码慢1200倍,而且它只慢2倍似乎更合理。。。那么这里到底发生了什么?
为了以防万一有用,下面是正在调用的基准函数:
func test_Native_CreateArray() {
myArr := []int {1, 2, 3}
gogenerics.RemoveUnusedError(myArr)
}
func test_Gostack_CreateArray() {
myStack := MakeStack([]int {1, 2, 3})
gogenerics.RemoveUnusedError(myStack)
}
// native Go
func Benchmark_Native_CreateArray(b *testing.B) {
for i := 0; i < b.N; i++ {
test_Native_CreateArray()
}
}
// my software library "gostack"
func Benchmark_Gostack_CreateArray(b *testing.B) {
for i := 0; i < b.N; i++ {
test_Gostack_CreateArray()
}
}
如有任何澄清,我们将不胜感激。
第一个函数以0.61ns/op运行了1_000_000_0000次,这是0.862秒总运行时间的0.61秒。
第二个函数以805ns/op运行1_576_087时间,这大约需要2.225秒中的1.26875秒。强制第二个函数运行1_000_000_0000次,最终会产生大约805秒以上的开销。