2014-01-05 8 views
12

Ich versuche, Darts Effekt auf die Leistung besser zu verstehen. Auf der dart website, zeigen ihre Benchmarks, dass Dart-Code in Javascript kompiliert ist schneller als nur Javascript. Wie ist das möglich?Wie ist dart2js Code schneller als Javascript?

Tracer Benchmarks

Ich verstehe, wie die Dart VM schneller als v8 ist, aber was ich nicht bekommen, ist, wie dart2js generierte Javascript ist schneller als normale alte Javascript, wenn beide in der gleichen Umgebung ausgeführt werden, v8 .

+8

Weil es Optimierungen verwenden kann, die Sie nicht kennen oder zu faul sind. – SLaks

Antwort

16

dart2js kann Optimierungen durchführen, die normalerweise nicht manuell in JavaScript-Code hinzugefügt werden.

Es ist nichts besonderes, dass Dart in diesem Fall die Ausgangssprache ist: Jedes automatisierte Tool, das JavaScript erzeugt, sollte dies können, zum Beispiel der GWT-Compiler (Java to JavaScript). Natürlich können Sie auch automatisierte Tools auf der JavaScript-Quelle ausführen, um auch besseres JavaScript zu erzeugen, das ist das, was die Closure compiler tut.

Technisch können Sie manuell mit JavaScript die gleiche Geschwindigkeit erreichen, wenn Sie alle Tricks kennen.

+0

Bedeutet das, dass sie in ihrer Behauptung etwas irreführend sind? Wirklich ist es "optimiertes JS" gegen "schlampiges JS"? –

+7

@DA Ich denke, "schlampig" ist eine unfaire Fehlcharakterisierung. Selbst der beste geschriebene C-Code wird einige Optimierungen verpassen, die für einen Compiler offensichtlich sind, und jeder, der an einem gewöhnlichen Projekt arbeitet, optimiert seine Wartbarkeit. Ihre Behauptung könnte * leicht * irreführend sein, aber im Großen und Ganzen würde ich sagen, dass sie korrekt ist. –

+0

@ChrisHayes das macht Sinn. Ich denke, um genau zu sein sollten sie "dart2js optimiertes kompiliertes JavaScript" vs."JavaScript" –

6

Ein Beispiel ist Funktion Inlining. Wenn Sie ein mehrfach aufgerufenes Codefragment benötigen, würden Sie es in einer Funktion/Methode umdefinieren. Dart2js macht oft das Gegenteil. Methodenaufrufe werden oft durch das in der aufgerufenen Funktion/Methode enthaltene Inline-Code-Fragment ersetzt. Wenn Sie dies manuell tun würden, würde dies zu einem nicht mehr wartbaren Code führen.

Ich denke, viele der Optimierungen gehen in diese Richtung. Den Code auf diese Weise zu schreiben, wäre einfach unleserlich und daher nicht zu erreichen. Das bedeutet nicht, dass es schlampig ist.

+3

Moderne Laufzeiten und JITs werden dies gerne tun. –

+0

@BenjaminGruenbaum Richtig, aber würde nicht die Tatsache, dass es im Voraus gemacht ist, die JIT/Laufzeit einen Job speichern? – Hector

+0

Es ist nur ein einfaches Beispiel. Ich bin nicht in Compiler-Optimierungen, aber einige Mitglieder des Dart-Teams sind. Alle Beteiligten arbeiten ständig an Optimierungen, die immer wieder dazu führen, dass Optimierungen, die dart2js vorgenommen hat, obsolet werden, weil die JS VM dies bereits tut. Je mehr Menschen daran arbeiten, die Grenzen zu überschreiten, desto besser werden wir alle werden. –

3

Es gibt eine von Seth Ladd und Kasper Lund. Kasper ist an der Erstellung des Dart2js-Compilers beteiligt und gibt einige Codebeispiele, wie der Compiler den Javascript-Code optimiert.

+0

Relevanter Teil des Videos beginnt um ca. 7:30 Uhr. – ntc2

+0

Es gibt eine erweiterte Version des Dart2js Teil dieser Präsentation hier: http://youtu.be/GwBb_nqQLuc – ntc2

3

Es Vyacheslav Egorov aus dem Dart-Team eine große Präsentation ist, wo er im Futter einschließlich ..

http://www.infoq.com/presentations/dart-compiler

Zusammenfassung Vyacheslav Egorov Details einige der Optimierungen im Detail erläutert, wie einige Die Sprachfunktionen von Dart beeinflussten das Design eines neuen JIT Dart-Compilers und wie die JavaScript-Engine V8 das Gesamtdesign beeinflusste.

+1

Dieses Video ist über Dart VM und V8, nicht Dart2js. Es ist ein interessantes Video, aber nicht sehr relevant für die Frage. – ntc2