??????????????我的代码看起来像这样:
public static int counter = 0;
public static void operation(){????计数器++;}
?public static void square(int n){????for(int i = 0; i< n; i ++)????????for(int j = …????????
????这不是关于编译时间,而是关于运行时间。 ??
????Eclipse编译器和 ????? javac ?????由IntelliJ IDEA生成 ????的 ??????不同的字节码 ????强> ?????通过使用 ????的 ??????不同的优化 ????强> ????。同样在命令行上,如果使用两个编译器编译Java代码并在同一Java VM中执行它,则会获得这些不同的运行时间。 ??
javac
????例如,内循环 ????? square(int) ??
square(int)
for (int j = 0; j < n; j++) operation();
????是由Eclipse编译的 ??
L4 GOTO L5 L6 INVOKESTATIC Snippet.operation() : void IINC 2: j 1 L5 ILOAD 2: j ILOAD 0: n IF_ICMPLT L6
????而 ????? javac ?????创建以下字节码: ??
L4 ILOAD 2: j ILOAD 0: n IF_ICMPGE L5 INVOKESTATIC Snippet.operation() : void IINC 2: j 1 GOTO L4 L5
????在语义上,两者都是相同的,但跳跃( ????? GOTO ????)仅执行 ????? j = 0 ?????在Eclipse创建的字节码中,同时 ????? GOTO ?????在由。创建的字节码中执行349,999次 ????? javac ????。在Java VM生成的机器代码和处理器的优化(特别是内联和分支预测)的组合中,这可能导致执行时间的不同,就像在这种情况下一样(我想在一种情况下是静态字段) ????? counter ?????仅更新一次,在另一种情况下,它更新350,000 x 350,000次)。 ??
GOTO
j = 0
counter
????IntelliJ IDEA附带(旧版本的)Eclipse编译器,默认情况下不使用。所以 ???? ??????的 ????????使用Eclipse编译器 ??????强> ???? ?????应该创建相同的字节码。 ??