Windows 11下Java 17编译器比Java 8慢50%,求问题原因与解决方法
Java 17嵌入式编译器在Windows 11上比Java 8慢50%的问题
测试环境
- 系统:Windows 11(多台设备验证)
- JDK 17版本:17.0.10
- JDK 8版本:1.8.0.333
- 备注:Linux系统下无此性能差异
问题背景
我在项目中通过ToolProvider.getSystemJavaCompiler()获取JDK嵌入式编译器,调用compiler.getStandardFileManager(..)获取标准文件管理器,发现Java 17的编译速度远慢于Java 8。由于项目需要编译大量复杂类,这种速度差异会影响业务效率。
为了复现问题,我制作了10个仅包含基本类型变量及set/get方法的简单Bean类(无依赖,可独立编译),并编写测试类循环逐个编译这些类。多次测试结果一致:Java 17的总编译时间比Java 8高约50%。
测试输出示例
JDK 17编译耗时
JDK 17 Compiling several classes using JavaCompiler directly compiling Alpha.java=322 ms compiling Beta.java=38 ms compiling Delta.java=34 ms compiling Epsilon.java=27 ms compiling Gamma.java=27 ms compiling Iota.java=25 ms compiling Lambda.java=23 ms compiling Phi.java=24 ms compiling Pi.java=25 ms compiling Zeta.java=19 ms Total 564 ms
JDK 8编译耗时
JDK 8 Compiling several classes using JavaCompiler directly compiling Alpha.java=259 ms compiling Beta.java=15 ms compiling Delta.java=15 ms compiling Epsilon.java=14 ms compiling Gamma.java=15 ms compiling Iota.java=12 ms compiling Lambda.java=11 ms compiling Phi.java=13 ms compiling Pi.java=11 ms compiling Zeta.java=13 ms Total 378 ms
测试类代码
public class CompileTest { public void doCompile() { FilenameFilter ff = new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".java"); } }; System.err.println(); System.err.println("JDK 8 Compiling several classes using JavaCompiler directly"); JavaCompiler compiler=ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager fileManager=compiler.getStandardFileManager(null, Locale.getDefault(), Charset.forName("ISO-8859-1")); try { String sourceDir = "<source directory>"; String[] classes = new File(sourceDir).list(ff); long total = 0; for (int i = 0; i < classes.length; i++) { String path = sourceDir+"\\"+classes[i]; long t0 = System.currentTimeMillis(); compile(compiler, fileManager, path); t0 = (System.currentTimeMillis()-t0); System.err.println("\tcompiling "+classes[i]+"="+t0+" ms"); total+=t0; } System.err.println("Total "+total+" ms"); } catch (Exception e) { e.printStackTrace(); } System.err.println(); } private boolean compile(JavaCompiler compiler, StandardJavaFileManager fileManager, String toCompile) { List<String> plist = new ArrayList<>(); PrintWriter pw=new PrintWriter(System.out); File javaFile = new File(toCompile); Iterable fileObjects=fileManager.getJavaFileObjects(javaFile); boolean ret=compiler.getTask(pw, fileManager, null, plist, null, fileObjects).call(); return ret; } public static void main(String[] args) { CompileTest ct = new CompileTest(); ct.doCompile(); } }
疑问
是否有其他人遇到过同样的问题?能否解释该性能差异的原因,或提供优化解决思路?
内容的提问来源于stack exchange,提问作者Bernard Faure
相关产品推荐
相关产品推荐

