当我为我的算法编写基准测试时,我被一个问题弄糊涂了!
我的测试代码详细信息被推送到github,我将其复制到此处并添加一些注释。
https://github.com/hidstarshine/Algorithm/blob/master/leet/problem24_test.go
var TDBenchmarkSwapPairs1 *leet.ListNode
// This function may be not good, it should be init()?
func FTDBenchmarkSwapPairs1() {
TDBenchmarkSwapPairs1 = &leet.ListNode{
Val: 0,
Next: nil,
}
changeNode := TDBenchmarkSwapPairs1
for i := 1; i < 100; i++ {
changeNode.Next = &leet.ListNode{
Val: i,
Next: nil,
}
changeNode = changeNode.Next
}
}
func BenchmarkSwapPairs1(b *testing.B) {
FTDBenchmarkSwapPairs1() // problem is here
for i := 0; i < b.N; i++ {
leet.SwapPairs1(TDBenchmarkSwapPairs1)
}
}
在问题行中,我调用 FTD 模板标记交换对1(FTD 均值填充测试数据)来初始化数据。
然后发生了一些令人不安的事情,基准交换对1似乎在许多戈鲁廷中运行。
因此,并发性带来了数据竞争,并且由于SwapAirs1的特殊逻辑,调试陷入了混乱。
交换对1将更改列表节点中的下一个。
然后我想将基准测试交换对1移动到 的块中以解决此问题。
但是数据竞赛似乎仍未解决,并且由于初始化时间的原因,基准测试毫无意义。
我判断关于李码的阿戈里特姆并被接受!
问:我该如何优雅地解决这个问题?需要一个好主意!
智慧大石
相关分类