当前位置: 代码迷 >> java >> IntelliJ和Eclipse IDE之间的编译时间不同
  详细解决方案

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

热度:71   发布时间:2023-07-17 20:11:14.0

我的代码如下所示:

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

谢谢。

这与编译时间无关,而与运行时间有关。

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    

从语义上讲,两者是相同的,但是跳转( GOTO )仅在Eclipse创建的字节码中对j = 0执行,而GOTOjavac创建的字节码中执行349,999次。 在Java VM生成的机器代码与处理器优化(特别是内联和分支预测)结合起来的情况下,这可能导致执行时间大不相同(在这种情况下,我假设静态字段counter是仅更新一次,在其他情况下,更新350,000 x 350,000次)。

IntelliJ IDEA是Eclipse编译器(的较旧版本)附带的,默认情况下不使用。 因此, 应创建相同的字节码。

  相关解决方案