testing - 改进测试。Go 的基准测试?

标签 testing go benchmarking

在学习 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/

相关文章:

无法从外部主机访问 Docker 部署的镜像

ruby - 按每个恒定间隔的迭代次数进行基准测试

performance - Julia - CartesianIndices 的性能

testing - 在 zombie.js 中缺少 Raphael 依赖项?

node.js - 如何解密在 nodejs 中加密的 golang 中的 AES256 位密码?

testing - 模拟实体管理器

go - 如何使用反射来设置嵌套的结构域值

machine-learning - 有哪些机器学习基准?

c# - 如何测试C#代码与Sql Server存储过程的同步

unit-testing - 单元测试中的性能测试