为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
蝴蝶刀刀 2023-03-07 14:24:57
我正在对我在 Go 中创建的软件库进行基准测试,我遇到了运行时和 ns/op 之间的不协调。我是基准测试的新手,Go 的文档和过去的 stackoverflow 问题在概念上没有深入地涵盖基准测试,所以我正在寻找比我有更多概念知识的人来帮助我(和其他处于类似困境中的 stackoverflow 用户)理解到底发生了什么。使用本机 Go 执行的任务的基准输出:1000000000               0.6136 ns/op          0 B/op          0 allocs/opPASSok      github.com/gabetucker2/gostack/benchmark        0.862s使用我的软件库执行相同任务的基准测试输出:1576087               805.3 ns/op           544 B/op         21 allocs/opPASSok      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 Gofunc 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()    }}任何清晰度将不胜感激。
查看完整描述

1 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

第一个函数以 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 秒 + 开销结束。


查看完整回答
反对 回复 2023-03-07
  • 1 回答
  • 0 关注
  • 319 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号