Emscripten

Ein LLVM nach JavaScript Compiler


Titel | Inhalt | Einleitung | Grundlegendes | Arbeitsweise | Der Relooper | Grenzen | Performanz | Fazit | Quellen

Performanz

Im besten Fall erreichen mit Emscripten übersetzte Programme aktuell ungefähr die zweifache Ausführungszeit gegenüber nativ laufenden Programmen. Im Durchschnitt wird für realistische Anwendung eine vier-, bis fünffache Ausführungszeit erreicht. Dies ist abhängig von der JavaScript-Engine, mit der das Programm ausgeführt wird und dem Programm selber. Treten beispielsweise viele Speicherzugriffe auf, wird das übersetzte Programm langsamer sein.

Diese Geschwindigkeit reicht bereits aus, um viele Anwendungen im Web zu realisieren. Eindrucksvoll belegt wird das von vielen umgesetzten Beispielen, wie der im Browser laufenden Unreal 3 Grafik-Engine.


asm.js

Jedes von Compilern automatisch erzeugte JavaScript entspricht im Prinzip einer speziellen Untermenge von JavaScript. Emscripten und Mandreel haben sich dabei auf eine bestimmte Untermenge für aus C und C++ erzeugtes JavaScript geeinigt. Die Spezifikation dieser Untermenge heißt asm.js und ist aktuell noch nicht abgeschlossen. Maßgeblich daran beteiligt sind einige Entwickler von Mozilla, unter anderem auch Alon Zakai.

Diese Untermenge soll sich sehr gut optimieren lassen und ist allgemein als Zielsprache für generiertes JavaScript gedacht. Es handelt sich dabei aber noch um allgemeingültiges JavaScript, das von jeder JavaScript-Engine ausgeführt werden kann. Schneller läuft es aber nur, wenn die Engine solchen Code erkennt und speziell optimiert. Die in der aktuellen Firefox Version 22 genutzte JavaScript-Engine Odinmonkey unterstützt asm.js bereits und auch die von Chrome genutzte Engine V8 will asm.js unterstützen.

Was unter anderem verschiedene Optimierungen ermöglicht, ist die implizite Typisierung von generiertem JavaScript. Da der von Emscripten erzeugte Code der statisch typisierten LLVM Zwischensprache entspringt, ist er selbst auch implizit statisch typisiert. Daher sind die meisten Typüberprüfungen zur Laufzeit nicht mehr notwendig, was eine schneller Ausführung erlaubt.

Da die aktuelle Umsetzung von asm.js noch sehr jung ist, wird sich die mögliche Ausführungsgeschwindigkeit mit wachsender Unterstützung durch die JavaScript-Engines voraussichtlich noch weiter verbessern. Ein ausführlicher Artikel zu asm.js und Emscripten mit einigen Benchmarks wurde auf arstechnica veröffentlicht.


Titel | Inhalt | Einleitung | Grundlegendes | Arbeitsweise | Der Relooper | Grenzen | Performanz | Fazit | Quellen