如果我需要在每次迭代中重置,如何进行基准测试?

我使用回溯编写了一个小型数独求解器。现在我想对这个函数的速度进行基准测试。这是我当前的代码:


type Board struct {

    Cells [9][9]int

}


func BenchmarkBacktrack(b *testing.B) {

    for i := 0; i < b.N; i++ {

        b.StopTimer()

        // prevent the modification of the orignal board

        copy := &Board{

            Cells: exampleBoard.Cells,

        }

        b.StartTimer()

        copy.Backtrack()

     }

}

由于&Board是指针,我将在第一次迭代中解决数独问题,而在下一次迭代中,我将回溯已解决的棋盘。因此,我在每次迭代开始时重置电路板。exampleBoard充满了样本值。


他们是否是一种更好的方法来对功能进行基准测试,而无需一遍又一遍地停止和重新启动计时器?


并且不会让函数调用花费少量时间来影响基准测试?


临摹微笑
浏览 137回答 2
2回答

Qyouu

并且不会让函数调用花费少量时间来影响基准测试?他们当然会。for包含在基准测试中的循环也是如此。加上调用copy.Backtrack函数的开销。但问题是,这应该是无关紧要的,除非您对单个操作进行基准测试需要纳秒(在这种情况下您不应该这样做)。创建一个空板可能是一个微不足道的操作,所以我根本不会碰定时器。如果这不是微不足道的,那么你做对了 - 调用StopTimer.&nbsp;这正是它被发明的原因:StopTimer 停止对测试计时。这可用于在执行您不想测量的复杂初始化时暂停计时器。

FFIVE

您可以尝试提供一种func NewBoard([9][9]int) *Board方法,该方法仅从示例数据初始化板。然后Backtrack()在新板上编写一个基准测试,并为NewBoard().减去这两个数字应该可以让您了解仅使用回溯方法的速度。type Board struct {&nbsp; &nbsp; Cells [9][9]int}var scratch *Boardfunc NewBoard(cells [9][9]int) *Board {&nbsp; &nbsp; return &Board{Cells: cells}}func BenchmarkBacktrack(b *testing.B) {&nbsp; &nbsp; for i := 0; i < b.N; i++ {&nbsp; &nbsp; &nbsp; &nbsp; scratch = NewBoard(exampleBoard.Cells)&nbsp; &nbsp; &nbsp; &nbsp; scratch.Backtrack()}func BenchmarkNewBoard(b *testing.B) {&nbsp; &nbsp; for i := 0; i < b.N; i++ {&nbsp; &nbsp; &nbsp; &nbsp; scratch = NewBoard(exampleBoard.Cells)}还要注意scratch变量的使用。尝试在基准循环内创建循环局部变量可能会导致编译器NewBoard()根据存在/不存在副作用来优化调用。对于奇偶校验,您需要scratch在两个基准测试中都使用该变量。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go