递归-干净的代码与性能

时间:2018-07-22 21:10:21

标签: performance recursion readability

在编写干净的代码与提高性能开销之间,我有一个小的冲突。

假设我正在使用JAVA中的递归扫描NxN数组,而我唯一的停止条件是停留在数组边界。

我可以编写如下的函数,它更简洁易读:

private void move(int x, int y){
    if(outOfBound(x,y)){ \\ stopping condition
        return;
    }

    move(x+1, y);
    move(x, y+1);
    move(x-1, y);
    move(x, y-1);
}

或者我可以这样写:

private void move(int x, int y){
    if(!outOfBound(x+1,y)){ \\ stopping condition
        move(x+1, y);
    }
    if(!outOfBound(x,y+1)){ \\ stopping condition
        move(x, y+1);
    }
    if(!outOfBound(x-1,y)){ \\ stopping condition
        move(x-1, y);
    }
    if(!outOfBound(x,y-1)){ \\ stopping condition
        move(x, y-1);
    }
}

据我所知,可以保存4N个递归调用(4N个新的堆栈帧)。

那么,编写第二个函数以避免不必要的调用会“更正确”吗?

1 个答案:

答案 0 :(得分:1)

解决这一难题的方法只有一种-在实际项目环境中衡量性能。

如果这严重影响了现实生活中的性能并成为瓶颈,请务必将其更改为次优状态。

另一方面,如果它并没有真正改变应用程序的整体性能,请使其更加清洁。由于代码肮脏而引入的一个错误,以纯美元计算的成本要比与代码肮脏的服务器相关的成本高得多。