优化嵌套 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
假设我有一些代码如下所示。
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