如何初始化测试数据,以便在高浪进行基准测试?

当我为我的算法编写基准测试时,我被一个问题弄糊涂了!


我的测试代码详细信息被推送到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移动到 的块中以解决此问题。


但是数据竞赛似乎仍未解决,并且由于初始化时间的原因,基准测试毫无意义。


我判断关于李码的阿戈里特姆并被接受!


问:我该如何优雅地解决这个问题?需要一个好主意!


偶然的你
浏览 76回答 1
1回答

智慧大石

如果您有多个基准测试函数,则可能不希望它们干扰彼此的数据,因此请使用局部变量而不是(共享)包级变量。您可以使用 *B.Reset 计时器从总体基准测试运行时间中删除设置时间。func BenchmarkSwapPairs1(b *testing.B) {&nbsp; &nbsp; root := &leet.ListNode{&nbsp; &nbsp; &nbsp; &nbsp; Val:&nbsp; 0,&nbsp; &nbsp; &nbsp; &nbsp; Next: nil,&nbsp; &nbsp; }&nbsp; &nbsp; changeNode := root&nbsp; &nbsp; for i := 1; i < 10000; i++ {&nbsp; &nbsp; &nbsp; &nbsp; changeNode.Next = &leet.ListNode{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Val:&nbsp; i,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Next: nil,&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; changeNode = changeNode.Next&nbsp; &nbsp; }&nbsp; &nbsp; b.ResetTimer()&nbsp; &nbsp; for i := 0; i < b.N; i++ {&nbsp; &nbsp; &nbsp; &nbsp; root = leet.SwapPairs1(root)&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go