Golang如何进行基准测试数据初始化_Golang基准测试数据初始化实践详解

应在循环外初始化测试数据以避免影响性能测量,go基准测试中需将数据初始化放在循环外或使用b.ResetTimer确保准确性。

Golang如何进行基准测试数据初始化_Golang基准测试数据初始化实践详解

Go语言中进行基准测试时,有时需要对测试数据进行初始化,比如构建大型切片map或复杂结构体。如果每次基准测试都重复初始化,会影响性能测量的准确性。因此,合理地进行数据初始化是写出可靠基准测试的关键一步。

基准测试中的数据初始化问题

Go的基准测试函数以BenchmarkXxx开头,接收*testing.B参数。它会循环执行被测代码多次(由b.N控制),以统计耗时。若在循环内初始化数据:

func BenchmarkProcessData(b *testing.B) {     for i := 0; i < b.N; i++ {         data := make([]int, 1000000)         // 初始化data...         processData(data)     } } 

这会导致make和初始化操作也被计入耗时,无法准确反映processData的真实性能。

使用Setup预初始化测试数据

正确做法是在循环外一次性准备数据。常见方式是在init()函数或TestMain中初始化,或直接在基准函数开始前完成:

立即学习go语言免费学习笔记(深入)”;

func BenchmarkProcessData(b *testing.B) {     // 预先初始化大数据     data := make([]int, 1000000)     for i := range data {         data[i] = rand.Intn(1000)     }      b.ResetTimer() // 可选:重置计时器,排除初始化时间     for i := 0; i < b.N; i++ {         processData(data)     } } 

注意: 如果初始化耗时较长且与被测逻辑无关,建议调用b.ResetTimer(),让计时从那之后开始。

Golang如何进行基准测试数据初始化_Golang基准测试数据初始化实践详解

硅基智能

基于Web3.0的元宇宙,去中心化的互联网,高质量、沉浸式元宇宙直播平台,用数字化重新定义直播

Golang如何进行基准测试数据初始化_Golang基准测试数据初始化实践详解62

查看详情 Golang如何进行基准测试数据初始化_Golang基准测试数据初始化实践详解

避免副作用影响多次迭代

如果被测函数会修改数据,而你希望每次迭代都处理“干净”的输入,就需要在循环内复制或重建数据。但要确保复制操作不主导耗时:

func BenchmarkProcessDataSafe(b *testing.B) {     original := make([]int, 10000)     for i := range original {         original[i] = rand.Intn(1000)     }      b.ResetTimer()     for i := 0; i < b.N; i++ {         data := make([]int, len(original))         copy(data, original) // 复制原始数据         processData(data)     } } 

若复制成本过高,可考虑设计无副作用的函数,或使用支持重置状态的对象

全局共享初始化数据

对于多个基准函数共用相同数据,可在包级变量中初始化一次:

var globalData []int  func init() {     globalData = make([]int, 500000)     for i := range globalData {         globalData[i] = rand.Intn(1000)     } }  func BenchmarkFuncA(b *testing.B) {     for i := 0; i < b.N; i++ {         processA(globalData)     } }  func BenchmarkFuncB(b *testing.B) {     for i := 0; i < b.N; i++ {         processB(globalData)     } } 

这样避免了重复初始化,提升测试效率。

基本上就这些。关键是把初始化移到基准循环之外,根据是否修改数据决定是否复制,并善用b.ResetTimer()排除准备阶段的影响。

上一篇
下一篇
text=ZqhQzanResources