- Система : Windows 11 (проверено на нескольких компьютерах)
- JDK 17: 17.0.10
- JDK 8: 1.8.0.333
- В Linux проблем нет.
В моем реальном проекте эта разница может стать проблемой, поскольку мне приходится компилировать много гораздо более сложные классы.
Есть ли у кого-нибудь такая же проблема?
Есть идеи, что происходит?
В качестве теста у меня есть создал 10 очень простых классов (в основном bean-компоненты с примитивными переменными и методами set и get), для компиляции которых не нужны дополнительные классы или jar-файлы.
Я создал класс, который компилирует эти 10 bean-компонентов , используя цикл для компиляции каждого файла друг друга.
Общее время компиляции в JDK 17 примерно на 50 % выше, чем в JDK 8.
Я запускал этот тест много времени, с тем же результатом.
Вот пример вывода:
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 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 = "";
String[] classes = new File(sourceDir).list(ff);
long total = 0;
for (int i = 0; i < classes.length; i++) {
String path = sourceDir+"\\"+classes;
long t0 = System.currentTimeMillis();
compile(compiler, fileManager, path);
t0 = (System.currentTimeMillis()-t0);
System.err.println("\tcompiling "+classes+"="+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) {
long t0;
List 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();
}
}
Подробнее здесь: https://stackoverflow.com/questions/781 ... 8-compiler