当从未执行的代码被注释掉时,Java 程序运行速度较慢
我在我的一个Java程序中观察到一些奇怪的行为。我试图尽可能地精简代码,同时仍然能够复制行为。代码全文如下。
public class StrangeBehaviour {
static boolean recursionFlag = true;
public static void main(String[] args) {
long startTime = System.nanoTime();
for (int i = 0; i < 10000; i ++) {
functionA(6, 0);
}
long endTime = System.nanoTime();
System.out.format("%.2f seconds elapsed.\n", (endTime - startTime) / 1000.0 / 1000 / 1000);
}
static boolean functionA(int recursionDepth, int recursionSwitch) {
if (recursionDepth == 0) { return true; }
return functionB(recursionDepth, recursionSwitch);
}
static boolean functionB(int recursionDepth, int recursionSwitch) {
for (int i = 0; i < 16; i++) {
if (StrangeBehaviour.recursionFlag) {
if (recursionSwitch == 0) {
if (functionA(recursionDepth - 1, 1 - recursionSwitch)) return true;
} else {
if (!functionA(recursionDepth - 1, 1 - recursionSwitch)) return false;
}
} else {
// This block is never entered into.
// Yet commenting out one of the lines below makes the program run slower!
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
System.out.println("...");
}
}
return false;
}
}
我有两个函数,它们以递归方式相互调用。这两个函数都采用一个控制递归终止的参数。 调用次数最多为一次,且未更改。 使用 调用 16 次。当使用 a 调用时,递归终止。functionA()
functionB()
recursionDepth
functionA()
functionB()
recursionDepth
functionB()
functionA()
recursionDepth - 1
functionA()
recursionDepth
0
functionB()
具有包含多个调用的代码块。此块永远不会输入到中,因为输入由一个变量控制,该变量设置为在程序执行期间永远不会更改。但是,即使注释掉其中一个调用也会导致程序运行速度变慢。在我的计算机上,执行时间为<0.2s,所有调用都存在,当其中一个调用被注释掉时,执行时间为>2s。System.out.println()
boolean recursionFlag
true
println()
println()
是什么导致了这种行为?我唯一的猜测是,有一些幼稚的编译器优化是由与代码块的长度(或函数调用次数等)相关的参数触发的。任何对此的进一步见解将不胜感激!
编辑:我使用的是JDK 1.8。