此代码(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.
答案 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)
}
}