我正在使用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())
}
这将打印ok
几次,然后0 0 ns/op
,但基准显然确实运行了。
答案 0 :(得分:3)
我认为你做的一切都是正确的。 testing.Benchmark()
的文件说:
Benchmark基准测试单一功能。用于创建不使用&#34; go test&#34;的自定义基准测试。命令。
如果f调用Run,则结果将是运行所有不在单个基准测试中不按顺序调用Run的子基准测试的估计值。
调查实施(Go 1.7.4):
func Benchmark(f func(b *B)) BenchmarkResult {
b := &B{
common: common{
signal: make(chan bool),
w: discard{},
},
benchFunc: f,
benchTime: *benchTime,
}
if !b.run1() {
return BenchmarkResult{}
}
return b.run()
}
这一行:
if !b.run1() {
return BenchmarkResult{}
}
b.run1()
应该运行您传递的函数一次,并检测它是否具有子基准。你的。它返回bool
是否需要更多运行。在run1()
内:
if b.hasSub || b.finished {
// ...
return true
}
它恰当地告诉它有子基准,Benchmark()
- 高贵简洁 - 只返回一个空的BenchmarkResult
:
if !b.run1() {
return BenchmarkResult{}
}
我确实相信这是一个错误(或者更确切地说是#34;不完整的&#34;特征),或者doc是不正确的。我建议在此处提出问题:https://github.com/golang/go/issues
答案 1 :(得分:1)
答案澄清:
我的猜测是你正在使用go run来运行测试。这不会产生任何结果。为了在编写代码时运行代码,您需要使用
go test -bench =。而且我认为它应该有效。
该文件必须命名为test_xxx.go,其中xxx是您想要的任何内容。
如果你重新编写代码,它可以作为单个函数基准运行:
private static Dictionary<char, char> openByClose = new Dictionary<char, char>() {
{ '}', '{' },
{ ']', '[' },
{ ')', '(' },
};
private static bool IsBalanced(string source) {
if (string.IsNullOrEmpty(source))
return true;
Stack<char> brackets = new Stack<char>();
foreach (char ch in source) {
char open;
if (openByClose.Values.Contains(ch)) // ch is an opening bracket
brackets.Push(ch);
else if (openByClose.TryGetValue(ch, out open)) // ch is a closing bracket
if (!brackets.Any())
return false; // too many closing brackets, e.g. "())"
else if (brackets.Pop() != open)
return false; // brackets don't correspond, e.g. "(]"
}
return !brackets.Any(); // too many opening brackets, e.g. "(()"
}