捕获数组索引错误

时间:2018-01-02 19:12:12

标签: arrays go error-handling

我刚刚开始学习Go,并且我实现了一种算法,该算法在对角线方向,垂直和水平方向上检查四个连续数组索引的相等值。我设计它以便每个方向都有一个函数,我想知道是否有办法让我捕获索引错误而不必花费额外的开销来检查每个索引是否在索引约束的范围内。

func (state *State) checkTopLeftDiagonal(row, col int) bool {
    token := state.Board[row][col]
    b := token == state.Board[row-3][col-3] && token == state.Board[row-2][col-2] 
                  && token == state.Board[row-1][col-1]
    return b
}

func (state *State) CheckWinner(row, col int) bool {
    for i := 0; i < 4; i++ {
        if state.checkTopLeftDiagonal(row+i, col+i) == true {
            return true
        }
    }
    return false
}

1 个答案:

答案 0 :(得分:2)

开销是多少?

&#34;重&#34;和&#34;慢&#34;程序通常每秒处理数十或数十万个数据点。单个if语句确实需要在计算机每秒钟经过的数十亿个时钟周期中花费少量时钟周期(1 GHz =单个核心机器上10亿个时钟周期)。

如果你担心边界检查开销(似乎是一个相当简单的程序),你就不应该使用Go。您甚至不应该使用C ++或C.您应该直接在汇编中编写此程序,并且应该花费数小时微调每条指令以优化纳秒级的分数

与评论中所述的@leafbebop一样,任何其他模式都会带来更多的开销。

更一般地说,除非您知道需要特别高的性能和低延迟(例如电子股票交易系统,游戏或3D渲染),否则通常最好先构建并稍后优化你有&#34; profiled&#34;您的代码,以识别重型部件。除非你的功能每秒被调用数百万次,否则它所使用的计算能力几乎为零。使代码变慢的原因是迭代非常大的数据集,等待网络出现瓶颈(如果处理数千个网络请求),或者使用大量内存(在千兆字节范围内)。

if语句不会使程序变慢。

购买速度更快的硬件几乎总是比购买速度更快的软件更便宜(开发时间更长)。 :)