IntelliJ和Eclipse IDE之间的编译时间不同

时间:2019-02-21 11:07:30

标签: java eclipse intellij-idea

我的代码如下:

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相同的结果?

谢谢。

1 个答案:

答案 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应该创建相同的字节码。