递归——干净的代码与性能

Recursion - clean code vs performance

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

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

我可以把函数写成下面这样,更简洁易读:

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 个新堆栈帧)。

那么,为了避免不必要的调用,是否'more correct'写第二个函数?

只有一种方法可以解决这个难题——在实际项目环境中衡量绩效。

如果这在实际场景中严重影响性能,并成为瓶颈,请务必将其更改为不太理想的。

另一方面,如果它并没有真正改变您应用的整体性能,那就让它更干净一些。一个因脏代码而引入的 bug 以纯美元计算比与稍微脏一点的代码相关的服务器成本要多得多。