在学习 Go 时,我看到您可以使用 fmt.Println(testing.Benchmark(BenchmarkFunction))
对函数进行基准测试, 已设置以下内容:
func BenchmarkFunction(b *testing.B) {
n := 42
for i := 0; i < b.N; i++ {
_ = Function(n)
}
}
但是,由于 BenchmarkFunction
代码将针对您要执行此操作的每个方法的每个基准重复(因此代码味道,就 DRY 而言),有没有办法可以使用闭包(或以其他方式)重写,这样函数的基准可以重写如下:
fmt.println(test.BenchmarkMyFunction(MyFunction(parameters...)))
并添加到我的代码或测试
库中?
最佳答案
实际上,这不是在 Go 中进行基准测试的正确方法。
实际标准是将您的基准测试代码放入名称为 BenchmarkXXX
的函数中,其中 XXX 是您喜欢的任何名称。然后在定义这些文件的包上运行 go test -bench=.
。 go test
正在为您运行所有基准测试。
如果您有类似的基准测试但参数略有不同,您可以编写一个通用的基准测试函数,该函数仅由所有其他基准测试调用:
func genericBenchmarkFoo(b *testing.B, param int) { ... }
然后为每个特定的基准编写样板函数:
func BenchmarkFoo1(b *testing.B) { genericBenchmarkFoo(b, 1) }
func BenchmarkFoo2(b *testing.B) { genericBenchmarkFoo(b, 2) }
func BenchmarkFoo3(b *testing.B) { genericBenchmarkFoo(b, 3) }
func BenchmarkFoo4(b *testing.B) { genericBenchmarkFoo(b, 4) }
您可以在 package 中找到此模式的示例我写了。
当然这并不完美,但恐怕没有更简单的解决方案。然而,找到一小组代表您想要做的事情的基准是干净的编码。
关于testing - 改进测试。Go 的基准测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16920669/