Leistung der V8-Javascript-Engine von Google in Solr

Die Verwendung von Skriptsprachen zum Hinzufügen neuer Funktionen zu Systemen ist etwas, das ich immer als sehr hilfreich empfunden habe.…

Die Verwendung von Skriptsprachen zum Hinzufügen neuer Funktionen zu Systemen ist etwas, das ich immer als sehr hilfreich empfunden habe. Sie brauchen den Quellcode des Systems nicht herunterzuladen. Wenn es „skriptfähige“ Teile hat, können Sie einfache Funktionen in wenigen Minuten hinzufügen, ohne sie überhaupt zu kompilieren. Java bietet diese Möglichkeiten vor allem mit Javascript. Weitere Informationen hierzu finden Sie unter http://java.sun.com/developer/technicalArticles/J2SE/Desktop/scripting/.

Leider ist die einzige in Java 6 enthaltene Bibliothek Rhino, die den Javascript-Code in JVM-Code umwandelt, und ihre Leistung ist nicht gut. Aus Gründen wie diesen erleben die Skriptsprachen im Allgemeinen etwas, das Java in der Vergangenheit selbst zu spüren bekam: den weit verbreiteten Glauben, dass sie langsam sind.

Die Leistung ist sicherlich nicht so schlecht, aber in einer kritischen Anwendung würde man lieber native (Java-)Komponenten entwickeln, um die Leistung zu erhalten, als mit einem wahrscheinlich unnötigen Skript Leistung zu verlieren. In diesem Eintrag geht es um die Leistung von Skriptsprachen, insbesondere um andere Javascript-Engines, die Sie an Java anhängen können.

Google Chrome hat alle mit seiner rasend schnellen Javascript-Engine überrascht: V8.

Ich habe V8 heruntergeladen und mit der regulären Rhino-Option getestet. Ich habe weder die notwendigen Wrapper implementiert, um V8 in Java einzubinden, noch die JNI C-Programmierung, die notwendig ist, um auf V8-Funktionen zuzugreifen (die im traditionellen Sinne nativ sind, d.h. echter Maschinencode, der auf echten Prozessoren läuft, wie in den alten Tagen). Ich habe eine Bibliothek verwendet, die ich im Internet gefunden habe: http://code.google.com/p/jav8/.

Für den ersten Test habe ich einen Benchmark von V8 heruntergeladen, der eine RSA-Verschlüsselung eines Textes mit Javascript berechnet. Ich weiß, Sie werden das Gefühl haben, dass ich schummle, indem ich einen Benchmark verwende, der nicht unparteiisch ist, aber die Ergebnisse sind trotzdem ziemlich schlüssig: http://v8.googlecode.com/svn/data/benchmarks/.

Der Code ( hier herunterladen) zeigt auch die grundlegende Verwendung der Skripting-Funktionalität von Java.

public class main {

	public static void main(String[] args) throws FileNotFoundException {

		ScriptEngineManager sm = new ScriptEngineManager();
		FileReader file = new FileReader("test.js");
		ScriptEngine jsEngine = sm.getEngineByName("jav8");

		int iter = Integer.parseInt(args[0]);

		try {
			long acum = 0;
			for(int i=0; i<iter; i++){
				long start = System.currentTimeMillis();
				Object ob = jsEngine.eval(file);
				long end = System.currentTimeMillis();

				acum += end - start;
			}
			System.out.println(acum);
		} catch (ScriptException ex) {
			ex.printStackTrace();
		}
	}
}

Ich habe ein einfaches Bash-Skript erstellt, mit dem ich dies mehrmals mit einer unterschiedlichen Anzahl von Iterationen durchführen kann. Die Ergebnisse sind wie folgt (X steht für die Iterationen und Y für die Zeit, weniger ist also besser)Leistungsanalyse

Der Leistungsunterschied ist herausragend. Besonders interessant ist die Skalierbarkeit von V8, wenn wir mehr Iterationen hinzufügen. V8 verfügt über ein fortschrittliches Cache-System, das sicherlich dazu beiträgt, die Leistung zu erhalten, wenn die Iteration wächst.

Eine echte Anwendung, die eine Reihe von sich wiederholenden Aufgaben ausführt, ist der ScriptTransformer des Data Import Handlers von Solr. Dieser Transformer wendet eine in Javascript geschriebene Funktion auf jede Zeile einer Tabelle an. Diese berühmt-berüchtigte Komponente ist zwar sehr nützlich, aber ihre Leistung war schon immer grauenhaft.

Um die Tests fortzusetzen, habe ich die Standard-Rhino-Skript-Engine mit V8 verglichen, das auf den ScriptTransformer von Solr angewendet wird. Ich musste den ScriptTransformer modifizieren und seine „Reflection Style“-Implementierung entfernen (anscheinend, um die Kompatibilität mit 1.5 zu wahren, aber trotzdem ziemlich hässlich), damit jav8 mit ihm funktioniert. Der Test bestand darin, 5000 Textdatensätze aus einer Datenbank zu verschlüsseln. (geändertes ScriptTransformer.java)

Die Ergebnisse:

Motor Benötigte Zeit (Sekunden)
V8 12,347
Nashorn 83,255

Auch hier zeigen die Ergebnisse, dass V8 mit großem Vorsprung gewinnt.

Die Schlussfolgerung, die wir hier ziehen, ist, dass das Hinzufügen von Skript-Engines zu unseren Systemen nicht bedeutet, dass die Leistung beeinträchtigt wird. Wenn Sie die Verwendung nativer Bibliotheken (in diesem Fall V8) akzeptieren, kann eine Skript-Engine Ihre Systeme viel flexibler machen, ohne sie zu verlangsamen.

You Might Also Like

Vom Suchunternehmen zum praktischen KI-Pionier: Unsere Vision für 2025 und darüber hinaus

CEO Mike Sinoway gibt Einblicke in die Zukunft der KI und stellt...

Read More

Wenn KI schief geht: Fehlschläge in der realen Welt und wie man sie vermeidet

Lassen Sie nicht zu, dass Ihr KI-Chatbot einen 50.000 Dollar teuren Tahoe...

Read More

Lucidworks Kernpakete: Branchenoptimierte KI-Such- und Personalisierungslösungen

Entdecken Sie unsere umfassenden Core Packages, die Analytics Studio, Commerce Studio und...

Read More

Quick Links