为何VSCode编译的Java程序比手动javac编译的运行更快?
为何javac与ECJ编译的Java程序运行性能差异巨大,如何让javac编译版本追平?
我编写了如下基准测试程序:
public class App { public static void main(String[] args) { int n_iters = Integer.parseInt(args[0]); long tInit = System.currentTimeMillis(); int c = 0; for (int i = 0; i < n_iters; ++i) { for (int j = 0; j < n_iters; ++j) { for (int k = 0; k < n_iters; ++k) { if (i * i + j * j == k * k) { ++c; } } } } System.out.println(c); System.out.println((System.currentTimeMillis() - tInit) / 1000.0); } }
我将代码放在src目录下,手动执行javac src/App.java编译;VSCode的Java扩展会自动创建bin目录并编译出App.class文件。
运行测试发现性能差异显著:
- 执行
java -cp src App 1000耗时约1.8秒 - 执行
java -cp bin App 1000仅耗时0.56秒
我原本的认知是Java编译器不做优化,性能优化由JVM的JIT编译器负责,因此这种运行时长的差异完全不符合预期。
测试环境:
- 操作系统:Windows 11
- JDK:Java(TM) SE Runtime Environment (build 17.0.3.1+2-LTS-6)
- VSCode Java扩展(redhat.java):v1.10.0
[补充说明]:VSCode Java扩展使用ECJ编译器,ECJ与javac的编译方式存在差异,针对这个基准测试任务ECJ编译的代码表现更优,我现在正尝试让javac编译的程序达到相同的性能水平。
内容的提问来源于stack exchange,提问作者Du Shiqiao
相关产品推荐
相关产品推荐

