为什么Benchmark运行六(?)次

时间:2018-08-26 20:46:23

标签: go

此代码(playground link):

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.

为什么输出中有六个[]

此代码(playground link):

package main

import (
    "fmt"
)

var test = make([]int, 0)

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

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

[]

Program exited.

1 个答案:

答案 0 :(得分:4)

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

您的基准测试也没有像基准测试那样被实现:

  

基准功能必须运行目标代码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)
    }
}