2 回答
TA贡献1786条经验 获得超11个赞
并且不会让函数调用花费少量时间来影响基准测试?
他们当然会。for
包含在基准测试中的循环也是如此。加上调用copy.Backtrack
函数的开销。但问题是,这应该是无关紧要的,除非您对单个操作进行基准测试需要纳秒(在这种情况下您不应该这样做)。创建一个空板可能是一个微不足道的操作,所以我根本不会碰定时器。如果这不是微不足道的,那么你做对了 - 调用StopTimer
. 这正是它被发明的原因:
StopTimer 停止对测试计时。这可用于在执行您不想测量的复杂初始化时暂停计时器。
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在两个基准测试中都使用该变量。
- 2 回答
- 0 关注
- 136 浏览
添加回答
举报