使用testing.Benchmark不会产生任何输出

时间:2017-01-25 21:24:03

标签: 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 < b.N; n++ {
                println("ok")
            }
        })
    })

    println(result.String())

}

这将打印ok几次,然后0 0 ns/op,但基准显然确实运行了。

2 个答案:

答案 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. "(()"
}