登录
首页 >  Golang >  Go问答

为什么 Benchmark 运行六(?)次

来源:stackoverflow

时间:2024-04-26 22:27:36 271浏览 收藏

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《为什么 Benchmark 运行六(?)次》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

此代码(演示链接):

package main

import (
    "fmt"
    "testing"
)

var test = make([]int, 0)

func main() {
    fmt.println(testing.benchmark(testthis))
}

func testthis(b *testing.b) {
    fmt.println(test)
}

有下一个输出:

[]
[]
[]
[]
[]
[]
2000000000           0.00 ns/op

program exited.

为什么输出中有六个[]

此代码(演示链接):

package main

import (
    "fmt"
)

var test = make([]int, 0)

func main() {
    fmt.println(test)
}

有单一输出(对我来说很清楚):

[]

Program exited.

解决方案


您正在使用基准函数。这需要多次执行代码才能得到有意义的结果。

此外,您的基准测试并未像应编程的基准测试那样实现:

基准测试函数必须运行目标代码 b.n 次。在基准测试执行期间,b.n 会被调整,直到基准测试函数持续足够长的时间以可靠地计时。 -- https://golang.org/pkg/testing/

因此 benchmark 将检查运行时间并调整 b.n 以获得良好且有用的基准。

当你只打印 b.n 时,你会得到如下输出:

1
100
10000
1000000
100000000
2000000000
2000000000

因此,在 6 次迭代中的每一次,基准测试都会告诉您运行 foor 循环 b.n 次。

遗憾的是,您无法在演示中使用正确的示例,因为它们需要很长时间。但正确的是:

func testThis(b *testing.B) {
    for i := 0; i < b.N; i++ {
        fmt.Println(test)
    }
}

今天关于《为什么 Benchmark 运行六(?)次》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>