Dieser Artikel stellt hauptsächlich die relevanten Informationen zu Nashorn vor, einer neuen Funktion von Java. Freunde, die sie benötigen, können darauf verweisen
Was ist Nashorn
Nashorn, ausgesprochen „nass-horn“, ist der Name eines deutschen Panzers während des Zweiten Weltkriegs. Es handelt sich auch um eine neue Generation der Java8-Javascript-Engine, die den alten und langsamen Rhino ersetzt mit der Sprachspezifikation ECMAScript-262 Version 5.1. Sie denken vielleicht, dass Javascript im Webbrowser läuft und verschiedene Dom-Operationen für HTML bereitstellt, aber Nashorn unterstützt keine Browser-DOM-Objekte. Dies ist ein Punkt, den es zu beachten gilt.
Über die ersten Schritte mit Nashorn
Hauptsächlich in zwei Aspekten, dem jjs-Tool und der API unter dem javax.script-Paket:
jjs kommt unter java_home/bin. Als Beispiel erstellen wir eine func.js mit dem folgenden Inhalt:
function f() { return 1; }; print( f() + 1 );
Führen Sie diese Datei aus und legen Sie diese ab Die Datei wird als Parameter an jjs übergeben
jjs func.js
Ausgabeergebnis: 2
Der andere Aspekt ist javax.script, der auch der Rest ist API von Rhino.
ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName( "JavaScript" ); System.out.println( engine.getClass().getName() ); System.out.println( "Result:" + engine.eval( "function f() { return 1; }; f() + 1;" ) );
Die Ausgabe ist wie folgt:
jdk.nashorn.api.scripting.NashornScriptEngine Result: 2 Nashorn VS Rhino
Javascript läuft auf JVM ist nichts Neues, Rhino Es existierte bereits in jdk6, aber warum muss es Rhino jetzt ersetzen? Die offizielle Erklärung ist, dass Rhino im Vergleich zu anderen Javascript-Engines (wie Googles V8) zu langsam ist um es umzuschreiben. Da die Leistung ein Highlight von Nashorn ist, testen wir den folgenden Leistungsvergleich. Um die Leistung zwischen beiden zu vergleichen, müssen Sie Esprima verwenden, ein ECMAScript-Parsing-Framework. Verwenden Sie es, um die unkomprimierte Version von jquery (ca. 268 KB) zu analysieren Testen Sie den Kern. Der Code lautet wie folgt:
static void rhino(String parser, String code) { String source = "speedtest"; int line = 1; Context context = Context.enter(); context.setOptimizationLevel(9); try { Scriptable scope = context.initStandardObjects(); context.evaluateString(scope, parser, source, line, null); ScriptableObject.putProperty(scope, "$code", Context.javaToJS(code, scope)); Object tree = new Object(); Object tokens = new Object(); for (int i = 0; i < RUNS; ++i) { long start = System.nanoTime(); tree = context.evaluateString(scope, "esprima.parse($code)", source, line, null); tokens = context.evaluateString(scope, "esprima.tokenize($code)", source, line, null); long stop = System.nanoTime(); System.out.println("Run #" + (i + 1) + ": " + Math.round((stop - start) / 1e6) + " ms"); } } finally { Context.exit(); System.gc(); } } static void nashorn(String parser, String code) throws ScriptException,NoSuchMethodException { ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine engine = factory.getEngineByName("nashorn"); engine.eval(parser); Invocable inv = (Invocable) engine; Object esprima = engine.get("esprima"); Object tree = new Object(); Object tokens = new Object(); for (int i = 0; i < RUNS; ++i) { long start = System.nanoTime(); tree = inv.invokeMethod(esprima, "parse", code); tokens = inv.invokeMethod(esprima, "tokenize", code); long stop = System.nanoTime(); System.out.println("Run #" + (i + 1) + ": " + Math.round((stop - start) / 1e6) + " ms"); } // System.out.println("Data is " + tokens.toString() + " and " + tree.toString()); }
Wie aus dem Code ersichtlich ist, führt das Testprogramm die Analyse und Tokenisierung von Esprima aus, um den Inhalt von auszuführen Die Testdatei wird von Rhino und Nashorn jeweils 30 Mal ausgeführt. Zu Beginn benötigt Rhino 1726 ms und stabilisiert sich schließlich bei etwa 950 ms. Der erste Durchlauf dauert 3682 ms nach dem Aufwärmen und stabilisiert sich schließlich bei 175 ms für jeden Lauf jvm. Die unterste Ebene verwendet zur Ausführung auch den Befehl invokedynamic, sodass die Ausführungsgeschwindigkeit sehr hoch ist.
Warum Java zum Implementieren von Javascript verwendenDies ist auch ein Punkt, der für die meisten Studenten Anlass zur Sorge gibt. Ich stimme dem zu: >1 . Ausgereifter GC2. Ausgereifter JIT-Compiler
Umfangreiche Standard- und Drittanbieterbibliotheken Es nutzt die vorhandenen Ressourcen der Java-Plattform vollständig aus. Zusammenfassung Man kann sagen, dass das neue Rhino ein Streitwagen im Rhino-Stil ist, viel schneller als Rhino Als Hochleistungs-Javascript In der Laufumgebung bietet Nashorn viele Möglichkeiten. Avatar.js verlässt sich beispielsweise auf Nashorn, um dasNode.js-Programmiermodell auf der JVM zu unterstützen, und fügt außerdem weitere neue Funktionen hinzu, wie z. B. die Verwendung eines integrierten Load Balancers implementiert mehrere Ereignisschleifen und nutzt Multithreading, um einen einfachen Messaging-Mechanismus zu implementieren; Avatar bietet außerdem einen Model-Store, ein reines JavaScript-ORM-Framework auf Basis von JPA. Eine weitere Möglichkeit, Nashorn im Unternehmen zu nutzen, ist die Verwendung von Skripten. Im Vergleich zur üblichen Verwendung von Shell-Skripten wie Linux können wir jetzt auch
Javascript-Skripte verwenden, um mit Java zu interagieren Verwenden Sie Nashorn, um den Serverzustand über die REST-Schnittstelle zu überwachen.
Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung von Beispielen von Nashorn, einer neuen Funktion von Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!