为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
临摹微笑 2021-11-22 16:15:50
我使用回溯编写了一个小型数独求解器。现在我想对这个函数的速度进行基准测试。这是我当前的代码: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充满了样本值。他们是否是一种更好的方法来对功能进行基准测试,而无需一遍又一遍地停止和重新启动计时器?并且不会让函数调用花费少量时间来影响基准测试?
查看完整描述

2 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

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

他们当然会。for包含在基准测试中的循环也是如此。加上调用copy.Backtrack函数的开销。但问题是,这应该是无关紧要的,除非您对单个操作进行基准测试需要纳秒(在这种情况下您不应该这样做)。创建一个空板可能是一个微不足道的操作,所以我根本不会碰定时器。如果这不是微不足道的,那么你做对了 - 调用StopTimer. 这正是它被发明的原因:

StopTimer 停止对测试计时。这可用于在执行您不想测量的复杂初始化时暂停计时器。


查看完整回答
反对 回复 2021-11-22
?
FFIVE

TA贡献1797条经验 获得超6个赞

您可以尝试提供一种func NewBoard([9][9]int) *Board方法,该方法仅从示例数据初始化板。然后Backtrack()在新板上编写一个基准测试,并为NewBoard().


减去这两个数字应该可以让您了解仅使用回溯方法的速度。


type Board struct {

    Cells [9][9]int

}


var scratch *Board


func NewBoard(cells [9][9]int) *Board {

    return &Board{Cells: cells}

}


func BenchmarkBacktrack(b *testing.B) {

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

        scratch = NewBoard(exampleBoard.Cells)

        scratch.Backtrack()

}


func BenchmarkNewBoard(b *testing.B) {

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

        scratch = NewBoard(exampleBoard.Cells)

}

还要注意scratch变量的使用。尝试在基准循环内创建循环局部变量可能会导致编译器NewBoard()根据存在/不存在副作用来优化调用。对于奇偶校验,您需要scratch在两个基准测试中都使用该变量。


查看完整回答
反对 回复 2021-11-22
  • 2 回答
  • 0 关注
  • 136 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信