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

Optimizing conditional code inside nested for-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循环中间应该是运行的代码?

我认为编译器能够优化它,但为了这个问题,你可以这样做

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();
    }
}

在这个特殊情况下,我会说它几乎是一样的。我总是会选择更简洁的代码而不是优化(因为如果不是 none,它将接近 none)。编译器可能会 optimize/cache 结果,即使它测试一个布尔值,它也是一个不会增加性能损失的操作。更长的代码确实如此;)您还可以使用接口和一些 OOP 模式来避免重复和 if/else。但它可能会添加额外的对象,所以只使用第一个选项。

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

在我看来,不要对这样的小事想太多是非常重要的。不要优化它,除非你看到一些性能问题并且没有其他可以改进的地方。

值得一提的是,很多时候编译器会自行优化,无需费心。顺便提一句。这篇关于哑代码的文章可能值得一看:https://www.oracle.com/technetwork/articles/java/devinsight-1-139780.html