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

我正在对我在 Go 中创建的软件库进行基准测试,我遇到了运行时和 ns/op 之间的不协调。我是基准测试的新手,Go 的文档和过去的 stackoverflow 问题在概念上没有深入地涵盖基准测试,所以我正在寻找比我有更多概念知识的人来帮助我(和其他处于类似困境中的 stackoverflow 用户)理解到底发生了什么。


使用本机 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()

    }

}

任何清晰度将不胜感激。


蝴蝶刀刀
浏览 321回答 1
1回答

月关宝盒

第一个函数以 0.61ns/op 运行了 1_000_000_000 次,这是总运行时间的 0.61 秒,总运行时间为 0.862 秒。第二个函数以 805ns/op 运行了 1_576_087 次,这大约需要 2.225 秒中的 1.26875 秒。强制第二个函数运行 1_000_000_000 次应该以大约 805 秒 + 开销结束。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go