Go基准测试:ns/op和运行时之间的不协调



我正在对我在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秒以上的开销。

最新更新