我的代码如下:
public static int counter = 0;
public static void operation() {
counter++;
}
public static void square(int n) {
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
operation();
}
public static void main(String[] args) {
System.out.println("Start...");
long start = System.nanoTime();
square(350000);
long end = System.nanoTime();
System.out.println("Run time: " + ((end - start) / 1000000)
+ " ms");
}
我尝试使用IntelliJ运行此代码,它花了6 500毫秒,而Eclipse则要快18毫秒。我正在使用Java 11的Skylake CPU。两者都设置为相同的设置,但我没有更改设置。
有没有一种方法/如何优化IntelliJ以获得与Eclipse相同的结果?
谢谢。
答案 0 :(得分:0)
这与编译时间无关,而与运行时间有关。
IntelliJ IDEA使用的Eclipse编译器和javac
通过使用不同的优化来生成不同的字节码。同样在命令行上,如果使用两个编译器编译Java代码并在同一Java VM中执行它们,则会得到不同的运行时间。
例如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
在语义上,两者相同,但是仅在由Eclipse创建的字节码中对GOTO
执行跳转(j = 0
),而在创建的字节码中GOTO
执行349,999次由javac
。在Java VM生成的机器代码与处理器优化(尤其是内联和分支预测)相结合的情况下,这可能导致执行时间大不相同,在这种情况下(我假设在一种情况下,静态字段{{ 1}}仅更新一次,在其他情况下,更新350,000 x 350,000次。
IntelliJ IDEA随Eclipse编译器一起(较旧的版本)提供,默认情况下不使用。因此using the Eclipse compiler应该创建相同的字节码。