JavaCompiler를 사용하여 동적으로 Java 클래스를 작성하고 컴파일하고 응용 프로그램에로드합니다.Java 클래스를 인스턴스화하는 동안 JavaCompiler가 느린 이유는 무엇입니까?
내 문제는 다음과 같습니다. JavaCompiler의 실행 시간이 동일한 클래스를 인스턴스화하는 표준 방법보다 훨씬 느립니다. 여기
예 : 그것이하여 JavaCompiler 방법보다 훨씬 빠릅니다 :이 코드를 측정 한 후, 나는 성능을 테스트하기 위해 VAR 소스 같은 내용으로 새로운 자바 클래스를 생성
static void function() {
long startTime = System.currentTimeMillis();
String source = "package myPackage; import java.util.BitSet; public class MyClass{ static {";
while (!OWLMapping.axiomStack.isEmpty()) {
source += OWLMapping.axiomStack.pop() + ";";
}
source += "} }";
File root = new File("/java");
File sourceFile = new File(root, "myPackage/MyClass.java");
sourceFile.getParentFile().mkdirs();
Files.write(sourceFile.toPath(), source.getBytes(StandardCharsets.UTF_8));
// Compile source file.
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, sourceFile.getPath());
// Load and instantiate compiled class.
URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });
Class<?> cls = Class.forName("myPackage.MyClass", true, classLoader);
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
System.out.println("EXECUTION TIME: " + elapsedTime);
}
. (표준 클래스를 사용할 수없는 이유는 응용 프로그램에서 동적으로 만들어야하기 때문입니다.) 그럼이 코드의 성능을 향상시킬 수 있습니까? 아니면이 낮은 성능은 정상입니까?
편집 : 나는 또한 테스트 생성 된 코드는 OWLAPI 공리의 간단한 순서입니다 :
package myPackage;
public class myClass{
static {
myPackage.OWLMapping.manager.addAxiom(myPackage.OWLMapping.ontology, myPackage.OWLMapping.factory.getOWLSubClassOfAxiom(/*whatever*/);
myPackage.OWLMapping.manager.addAxiom(myPackage.OWLMapping.ontology,myPackage.OWLMapping.factory.getOWLSubClassOfAxiom(/*whatever*/);
myPackage.OWLMapping.manager.addAxiom(myPackage.OWLMapping.ontology,myPackage.OWLMapping.factory.getOWLSubClassOfAxiom(/*whatever*/);
}
}
이 변수 소스가 포함되어 정확하게. 공리의 수는 사용자의 입력에 따라 다릅니다.
'while' 루프의'source'에'StringBuilder'를 사용하십시오. 컴파일러는 루프에서 연결을 최적화하지 않습니다. – 4castle
@ 4castle 나는 이것이 많은 차이를 만들지는 모르겠다. – Kayaman
나는 여기서 클래스를 인스턴스화하는 것을 실제로 보지 않는다. 코드가 소스를 작성해야 할 때 바이트 코드로 컴파일하고 _then_로드해야하며 일반적으로 마지막 단계 만 수행합니다. –