【问题标题】:Go benchmark by function name按函数名称进行基准测试
【发布时间】:2016-01-20 00:49:40
【问题描述】:

我有这个基准函数:

BenchmarkMyTest(b *testing.B) {
}

我想只运行这个函数而不运行所有其他测试,但是这个命令对我没有用。

go test -bench='BenchmarkMyTest'
or
go test -run='BenchmarkMyTest'

在 Go 中运行单个基准测试函数的正确方法是什么? 它说要使用正则表达式,但我找不到任何文档。

谢谢,

【问题讨论】:

  • go test -bench BenchmarkMyTest

标签: testing go benchmarking


【解决方案1】:

描述于Command Go: Description of testing flags:

-bench regexp
    Run benchmarks matching the regular expression.
    By default, no benchmarks run. To run all benchmarks,
    use '-bench .' or '-bench=.'.

-run regexp
    Run only those tests and examples matching the regular
    expression.

所以语法是你必须用空格或等号分隔它(没有撇号),你指定的是一个正则表达式:

go test -bench BenchmarkMyTest
go test -run TestMyTest

或者:

go test -bench=BenchmarkMyTest
go test -run=TestMyTest

精确指定 1 个函数

由于指定的表达式是一个正则表达式,这也将匹配名称中包含指定名称的函数(例如另一个名称以 this 开头的函数,例如"BenchmarkMyTestB")。如果只想匹配"BenchmarkMyTest",则追加正则表达式字边界'\b'

go test -bench BenchmarkMyTest\b
go test -run TestMyTest\b

请注意,仅将其附加到末尾就足够了,就好像函数名称不以 "Benchmark" 开头一样,它不被视为基准函数,同样,如果它不以 "Test" 开头, 不被认为是一个测试函数(无论如何也不会被拾取)。

【讨论】:

  • 我们如何解释结果?假设我跑了`go test -run BenchmarkPalindrome -bench=10000x`,结果ok DSA/mathematics 0.071s0.071 是总执行时间还是单次调用的执行时间?
  • @AnuragDhadse -bench=10000x 应该是什么意思?该语法用于告诉运行哪个基准(由正则表达式命名)。您看到的是没有基准与该正则表达式模式匹配,因此没有运行基准,只有“正常”测试(并且它们通过了)。 0.071s 是测试运行的时间。基准运行次数由基准框架确定。
【解决方案2】:

我发现这些答案不完整,所以这里有更多的主题......

以下命令运行以BenchmarkMyTest 开头的所有基准测试(BenchmarkMyTest1、BenchmarkMyTest2 等...)并跳过所有带有-run=^$ . 的测试

您还可以使用-benchtime 5s 指定测试持续时间,或者您可以使用-benchmem 强制b.ReportAllocs() 以获得如下值:

BenchmarkLogsWithBytesBufferPool-48     46416456                26.91 ns/op            0 B/op          0 allocs/op

最后的命令是:

go test -bench=^BenchmarkMyTest . -run=^$ . -v -benchtime 5s -benchmem

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-04
    • 2011-04-06
    • 1970-01-01
    • 2012-02-02
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多