Warum ist es schneller, externen Scala-Compiler aufzurufen, als die Laufzeit-Interpreter-Bibliothek zu verwenden? Im Code unter dauert es fast 2s, um den Interpreter aufzuwärmen.Warum ist es schneller, einen externen Scala-Compiler aufzurufen, als die Laufzeit-Interpreter-Bibliothek zu verwenden?
val out = new PrintStream(new FileOutputStream("/dev/null"))
val flusher = new java.io.PrintWriter(out)
val interpret = {
val settings = new scala.tools.nsc.GenericRunnerSettings(println _)
settings.usejavacp.value = true
new scala.tools.nsc.interpreter.IMain(settings, flusher)
}
interpret.interpret(" ") // <-- warming up
interpret.interpret(" Hello World ")
In der anderen Hand, wenn wie in einer Shell-Sitzung Compiler von der Kommandozeile Scala ausgeführt wird:
scala HelloWorld.scala
es weniger als 0,5 s nimmt eine Hallo Welt zu drucken.
Ich versuche, einige Java, Scala oder ähnlichen Code in einer Zeichenfolge während der Laufzeit zu analysieren + auszuführen (es ist ein Skript-Interpreter, d. H. Es wird nur einmal während meiner App-Ausführung ausgeführt). Scala-Code wäre natürlich besser, aber nur, wenn es so schnell wie die Java-Option sein kann. Gibt es eine schnellere Alternative als nsc.interpreter und externen Compiler zum Ausführen von Code aus einer Zeichenfolge zur Laufzeit? Das beste, was ich finden konnte, war Janino; Es ist schneller als der Scala-Compiler und benötigt kein JDK (ein sehr interessantes Feature).
Als letzte Ressource, wie schnell sind Java Scripting Engines im Vergleich zu einem reflektierten oder bytecode-kompilierten Java-Code? Ich habe herausgefunden, dass sie zumindest kompiliert werden können: Compiling oft-used scripts.
Gewählte Lösung: runtimecompilescala.
Können Sie den Aufwärmcode nicht zu einem früheren Zeitpunkt in Ihrem Programm asynchron ausführen? –
Was meinst du mit "von der Befehlszeile"? Von der REPL? Da ist klar, warum es schneller ist: Alle benötigten Klassen sind bereits geladen. – sschaef
@ 0__: Gute Idee, aber ich kann nicht. Es ist ein Interpreter von kleinen Skripten. Je schneller der Start, desto besser. –