英文:
Golang benchmark setup database
问题
我必须编写一些需要特定数据库设置的基准测试。类似这样的代码:
func BenchmarkXxx(b *testing.B) {
fmt.Println("Setup")
dropRecords()
createDatabaseRecords() // 这需要很长时间
fmt.Println("Start Test")
b.ResetTimer()
for i := 0; i < b.N; i++ {
fmt.Println("Loop")
TestMyStuffs()
}
}
运行这个基准测试,我可以在控制台看到"Setup"和"Start Test"被打印多次,所以BenchmarkXxx
函数似乎被调用了多次。有没有办法只运行一次设置代码(例如这个例子中的createDatabaseRecords
),并且只针对特定的基准测试运行?
有没有什么"最佳实践"来做到这一点?
英文:
I have to write some benchmarks that require a specific database setup. Something like this:
func BenchmarkXxx(b *testing.B) {
fmt.Println("Setup")
dropRecords()
createDatabaseRecords() // this require a lot of time
fmt.Println("Start Test")
b.ResetTimer()
for i := 0; i < b.N; i++ {
fmt.Println("Loop")
TestMyStuffs()
}
}
Running this benchmark I can see in the console that the "Setup" and "Start Test" are printing many times, so the BenchmarkXxx
function seems to be called many times. Is there a way to run a setup code (createDatabaseRecords
in this example) only one time and only for a specific benchmark?
Is there any sort of "best practice" to do this?
答案1
得分: 1
你可以使用子测试来处理这个案例,使用b.Run。
func BenchmarkXxx(b *testing.B) {
fmt.Println("设置")
setup() // 这需要很长时间
fmt.Println("开始测试")
b.Run("mytest", func(b *testing.B) {
b.ResetTimer()
for i := 0; i < b.N; i++ {
fmt.Println("循环")
testMyStuffs()
}
})
}
子基准测试与其他基准测试一样。调用Run至少一次的基准测试本身不会被测量,并且将以N=1调用一次。
因此,BenchmarkXxx
被调用一次,用于设置。
英文:
You can use sub-tests for this case, using b.Run
func BenchmarkXxx(b *testing.B) {
fmt.Println("Setup")
setup() // this require a lot of time
fmt.Println("Start Test")
b.Run("mytest", func(b *testing.B) {
b.ResetTimer()
for i := 0; i < b.N; i++ {
fmt.Println("Loop")
testMyStuffs()
}
})
}
> A subbenchmark is like any other benchmark. A benchmark that calls Run at least once will not be measured itself and will be called once with N=1.
Thus BenchmarkXxx
is called once, to do setup.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论