问题描述
我的代码如下所示:
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楼
这与编译时间无关,而与运行时间有关。
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
执行,而GOTO
在javac
创建的字节码中执行349,999次。
在Java VM生成的机器代码与处理器优化(特别是内联和分支预测)结合起来的情况下,这可能导致执行时间大不相同(在这种情况下,我假设静态字段counter
是仅更新一次,在其他情况下,更新350,000 x 350,000次)。
IntelliJ IDEA是Eclipse编译器(的较旧版本)附带的,默认情况下不使用。 因此, 应创建相同的字节码。