首页 > 解决方案 > IntelliJ 和 Eclipse IDE 之间的不同编译时间

问题描述

我的代码如下所示:

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 运行这段代码,它花了 6500 毫秒,而 Eclipse 用 18 毫秒要快得多。我使用的是 Skylake CPU,Java 11。两者都设置为相同的设置,我没有更改设置中的任何内容。

有没有办法/如何优化 IntelliJ 以获得与 Eclipse 相同的结果?

谢谢。

标签: javaeclipseintellij-idea

解决方案


这不是关于编译时间,而是关于运行时间。

javacIntelliJ IDEA 使用的 Eclipse 编译器通过使用不同的优化生成不同的字节码。同样在命令行上,如果您使用两个编译器编译 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    

语义上,两者是相同的,但跳转(GOTO)只j = 0在 Eclipse 创建的字节码GOTO中执行,而在javac. 在 Java VM 生成的机器代码和处理器的优化(尤其是内联和分支预测)的组合中,这可能会导致执行时间非常不同,就像在这种情况下一样(我想在一种情况下,静态字段counter会被更新)仅一次,在另一种情况下更新 350,000 x 350,000 次)。

IntelliJ IDEA 随附(旧版本)Eclipse 编译器,默认情况下不使用该编译器。所以使用 Eclipse 编译器应该创建相同的字节码。


推荐阅读