java - 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 相同的结果?
谢谢。
解决方案
这不是关于编译时间,而是关于运行时间。
javac
IntelliJ 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 编译器应该创建相同的字节码。
推荐阅读
- javascript - 如何更改事件的目标值(使用 Jest/Enzyme/React 进行单元测试)
- ruby-on-rails - 使用 Rails 仅触发特定操作的某些验证并设计
- html - 按钮被 div 边界切断
- php - php xml dom在结束标记前需要空格`/>`
- reactjs - 如何在使用材质 ui Skeleton 组件做出反应的循环阵列上显示多个加载骨架屏幕?
- python-3.x - Python - requests.get 后跟使用 HashLib 的文件比较
- python - 尽管已安装 matplotlib,但无法导入
- python - 文件未在烧瓶中上传
- c - 使用 CCS 使用编码器读取电机的位置和速度。请解释以下语法
- javascript - 提交表单后在javascript的弹出框中显示表单提交的结果