假设我有一些类似于下面的代码。
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循环中间运行的代码?
答案 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