Go 使用测试。基准测试不会产生任何输出
我正在使用Go 使用测试。基准测试不会产生任何输出,go,Go,我正在使用testing.Benchmark手动运行两个基准测试,但结果对象总是空的 我是不是遗漏了什么 下面是一个例子: package main import "testing" func main() { result := testing.Benchmark(func(parentB *testing.B) { parentB.Run("example", func(b *testing.B) { for n := 0; n <
testing.Benchmark
手动运行两个基准测试,但结果对象总是空的
我是不是遗漏了什么
下面是一个例子:
package main
import "testing"
func main() {
result := testing.Benchmark(func(parentB *testing.B) {
parentB.Run("example", func(b *testing.B) {
for n := 0; n < b.N; n++ {
println("ok")
}
})
})
println(result.String())
}
主程序包
导入“测试”
func main(){
结果:=testing.Benchmark(func(parentB*testing.B){
parentB.Run(“示例”,func(b*testing.b){
对于n:=0;n
这将打印几次
ok
,然后0 ns/op
,但是基准测试显然运行了一些东西。我认为您做的一切都是正确的。国防部说:
基准测试单个函数。用于创建不使用“go test”命令的自定义基准测试
如果f调用Run,则结果将是运行其所有子基准测试的估计值,这些子基准测试没有在单个基准测试中按顺序调用Run
调查实施情况(Go 1.7.4):
这一行:
if !b.run1() {
return BenchmarkResult{}
}
b.run1()
应该运行您传递的函数一次,并检测它是否有子基准。你的有。它返回一个bool
是否需要更多的运行。内部run1()
:
它正确地告诉我们它有子基准,而benchmark()
——非常简单——只返回一个空的BenchmarkResult
:
if !b.run1() {
return BenchmarkResult{}
}
我确实认为这是一个bug(或者更确切地说是“不完整”的特性),或者doc是不正确的。我建议在这里提出一个问题:编辑答案以澄清: 我猜您正在使用go run来运行测试。这不会产生任何结果。为了在编写代码时准确地运行代码,您需要使用
进行测试-测试台=。我认为它应该起作用。 该文件必须命名为test_xxx.go,其中xxx是您想要的任何文件 如果您重新构造代码,则可以将其作为单个函数基准运行:
package main
import "testing"
func main() {
myTest()
}
func myTest() {
fn := func(b *testing.B) {
for n := 0; n < b.N; n++ {
println("ok")
}
}
result := testing.Benchmark(fn)
println(result.String())
}
主程序包
导入“测试”
func main(){
我的测试()
}
func myTest(){
fn:=func(b*testing.b){
对于n:=0;n
您是否尝试过一些“纯”计算,而不仅仅是打印?我不知道该怎么做。好吧,没关系。我自己也试过了,但它确实不起作用,与文档相反。Benchmark
对单个函数进行基准测试。用于创建不使用“go test”命令的自定义基准测试。要完全按照编写的方式运行代码,他需要使用run-bench=。我将编辑我的原始答案,并说明如何重新构造它,使其能够测试单个函数。@PeterFendrich是的,不使用子基准测试是可行的。但是根据文档,提问者尝试的方法也应该有效(很可能他有更多的次级基准,为了简洁起见,没有包括在问题中),这就是这个问题的内容。是的,不使用次级基准是有效的,但这不是我要找的。
if !b.run1() {
return BenchmarkResult{}
}
package main
import "testing"
func main() {
myTest()
}
func myTest() {
fn := func(b *testing.B) {
for n := 0; n < b.N; n++ {
println("ok")
}
}
result := testing.Benchmark(fn)
println(result.String())
}