2014-09-12 10 views
9

Ich habe Rhino für eine Scripting-Komponente in Grafiken verwendet. Im Projekt laufen ca. 200 kleine Skripte unabhängig voneinander. Sofort nach dem Start der Anwendung sollten die Skripte auf Hochtouren laufen. Rhinos Leistung war ausreichend, aber da Oracle rät, nach Nashorn zu migrieren, stehe ich vor einem Dilemma.Kann Nashorn Startup Langsamkeit überwunden werden?

Unten ein Bild, das den Lastunterschied zwischen Rhino und Nashorn bei ungefähr 15.000 Aufrufen der Skripts zeigt. Die Startup-Langsamkeit von Nashorn ist mein größtes Problem.

Hinweis, dies war wieder auf JDK 1.8.0. JDK 1.8u5 ist ähnlich

Engine performance compared

Ich hoffe, dass das Bild klar ist.

Dies ist eine übersicht der Güter, wie ich die Scriptengine verwenden:

  • ich eine Scripting Engine-Instanz bin mit,
  • i für jedes Skript ein CompiledScript Objekt zu erstellen,
  • A Swingworker führt eine CompiledScript .eval() einmal.
  • Jede halbe Sekunde werden die SwingWorker gestartet.
  • Jedes CompiledScript verfügt über eine eigene SimpleScriptContext-Instanz, die für jede Ausführung wiederverwendet wird.

Im Folgenden habe ich ein Laufzeitprofil aufgenommen, wie beschäftigt der Motor im Laufe der Zeit ist; enter image description here

Wer weiß, wie die Start Langsamkeit von Nashorn zu überwinden?


UPDATE 15. April '15
Ran den gleichen Test mit 200 separater Skripte auf Java8u45.
Leistung ist viel besser! Läuft ähnlich schnell wie Rhino auf Java7.

+0

Rhino unter Java 1.8 könnte aufschlussreich sein. –

+0

Danke, das wäre meine letzte Hoffnung. By the way, ich lese [hier] (https://wiki.openjdk.java.net/display/Nashorn/Using+Rhino+JSR-223+engine+mit+JDK8), dass ich ein manuell gebautes Glas benötigen würde. Irgendeine Idee warum oder wäre es nur zur Entmutigung? – Houtman

+0

Ich lese: "Wenn Sie stattdessen eine vordefinierte Binärdatei erhalten möchten, können Sie von hier herunterladen:" - also kein Problem. Es ist nicht in Java 1.8 kompiliert - na und? –

Antwort

1

Auf Java 1.8, können Sie Rhino über die javax.script API verwenden, indem diese Maven Abhängigkeit verwenden und Anforderung der Motor rhino:

<dependency> 
     <groupId>de.christophkraemer</groupId> 
     <artifactId>rhino-script-engine</artifactId> 
     <version>1.1.1</version> 
    </dependency> 

Startseite hier: https://github.com/cevou/rhino-script-engine

Binaries: here

Wenn Sie die neueste Version von Rhino benötigen, können Sie sie überschreiben, indem Sie etwas wie folgt hinzufügen:

<dependency> 
     <groupId>org.mozilla</groupId> 
     <artifactId>rhino</artifactId> 
     <version>${rhinoVersion}</version> 
    </dependency> 

Binaries: here

Übrigens, wenn Sie die neueste Rhino auf Java 1.7 über javax.script, sollten Sie den Motor Namen rhino17R5 oder Sie vielleicht zufällig eine Instanz der alten Rhino erhalten beantragen bekommen verwenden möchten ist, welcher Teil der JRE. Der genaue Name der Engine hängt von der Version rhino-script-engine ab. Für 1.1.1 ist es rhino17R5.

+0

Danke. (Ich bin nicht vertraut mit Maven) Ich bin mir nicht sicher, aber wenn Ihr Rhino ist die gleiche Version wie mit diesem Artikel gebaut werden kann: https://wiki.openjdk.java.net/display/Nashorn/ Using + Rhino + JSR-223 + Engine + mit + JDK8 Dann ist dieser Interpreter tatsächlich ein bisschen langsamer als der, der in java7 eingebaut ist. Vielleicht weißt du warum? – Houtman

+0

Ich denke, das ist direkt von OpenJDK (vermutlich 7), weil es GPL + Classpath Ausnahme ist. Ich denke, es wäre eine viel neuere Implementierung als die, die Sie erwähnen. – seanf

+0

Die standardmäßige Rhino-Optimierungsebene hat sich möglicherweise zwischen der alten 'ScriptEngine'-Implementierung für Rhino und der neueren geändert. – seanf