在嵌套的for循环中优化条件代码

时间:2018-11-19 08:38:18

标签: java for-loop optimization nested-loops

假设我有一些类似于下面的代码。

boolean changecode = 0;

for (int i=0; i<4; i++) {
    //some code
    for (int j=0; j<4; j++) {
        //some more code
        if (changecode) {
            //Code A
        } else {
            //Code B
        }
    }
}

此代码将在每次循环运行时运行if条件,最终将其执行16次,这实际上并未进行优化。现在,我当然可以这样做:

boolean changecode = 0;

if (changecode) { 
    for (int i=0; i<4; i++) {
        //some code
        for (int j=0; j<4; j++) {
            //some more code
            //Code A
        }
    }
} else {
    for (int i=0; i<4; i++) {
        //some code
        for (int j=0; j<4; j++) {
            //some more code
            //Code B
        }
    }
}

但是我想这也没有真正优化,考虑所有代码的重复。有没有办法让条件语句在外层运行并替换应该在嵌套的for循环中间运行的代码?

3 个答案:

答案 0 :(得分:2)

我认为编译器将能够对此进行优化,但是出于问题的考虑,您可以这样做

Runnable code = changecode 
                   ? () -> codeA() 
                   : () -> codeB();
for (int i=0; i<4; i++) {
    //some code
    for (int j=0; j<4; j++) {
        //some more code
        code.run();
    }
}

答案 1 :(得分:2)

在这种情况下,我会说几乎相同。我总是会选择更干净的代码而不是优化(因为如果没有的话,它将接近无)。编译器可能会优化/缓存结果,即使它测试布尔值也不会增加性能损失。更长的代码可以做到;)您也可以使用接口和一些OOP模式来避免重复和if / else。但这可能会添加额外的对象,因此只需使用第一个选项即可。

答案 2 :(得分:1)

正如其他人指出的那样,布尔比较在性能方面非常便宜。仅仅为了使代码看起来更糟而进行的优化是不值得的。

在我看来,重要的是不要过分考虑像这样的小事情。除非您发现一些性能问题并且没有其他可改进之处,否则请不要对其进行优化。

值得一提的是,编译器通常会自行对其进行优化,因此无需打扰。顺便说一句。可能值得阅读有关愚蠢代码的文章:https://www.oracle.com/technetwork/articles/java/devinsight-1-139780.html