Ich benutze JavaCompiler, um eine Java-Klasse dynamisch zu erstellen, zu kompilieren und in meiner Anwendung zu laden.Warum JavaCompiler ist langsam beim Instanziieren einer Java-Klasse?
Mein Problem ist das folgende: die Ausführungszeit mit JavaCompiler ist viel langsamer als der Standard Weg, um die gleiche Klasse zu instanziieren.
Hier ein Beispiel:
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);
}
diesen Code Nach der Messung ich mit dem gleichen Inhalt der var Quelle eine neue Java-Klasse geschaffen, um die Leistung zu testen: es ist viel schneller als der JavaCompiler Weg . (Ich kann keine Standardklasse verwenden, da ich sie in meiner Anwendung dynamisch erstellen muss). Also, ist es möglich, die Leistung dieses Codes zu verbessern? Oder diese geringe Leistung ist normal?
EDIT: der erzeugte Code, den ich auch eine einfache Abfolge von OWLAPI Axiome getestet ist:
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*/);
}
}
und genau das, was die Variable Quelle enthält. Die Anzahl der Axiome hängt von der Eingabe des Benutzers ab.
Verwenden Sie einen 'StringBuilder' für die' Quelle' für die 'while' Schleife. Der Compiler optimiert die Verkettung in einer Schleife nicht. – 4castle
@ 4castle Ich bezweifle, dass das einen großen Unterschied machen würde. – Kayaman
Ich sehe nicht, dass Sie hier die Klasse instanziieren. Denken Sie daran, dass, wenn Ihr Code die Quelle schreiben muss, diese zu Bytecode kompiliert und dann geladen wird, während Sie normalerweise nur den letzten Schritt machen. –