2011-01-17 11 views
13

Gibt es irgendwelche guten Tutorials, wie man schnellen, effizienten Code für v8 schreibt (speziell für node.js)?Quetschen von Leistung aus v8

Welche Strukturen sollte ich vermeiden? Was sind die Idiome, die v8 optimal optimiert?

+0

Nur neugierig, aber warum fragst du? Sollten Sie sich nicht mehr darum sorgen, die Leistung der langsamsten (aber weit verbreiteten) Rendering-Engines zu reduzieren als die schnellste? Scheint, dass der Schnellste auf sich selbst aufpassen wird. – mVChr

+0

Ich möchte nur wissen, was V8 nicht mag. Effizienter Code ist mir wichtig. – nornagon

+0

Gute Antwort Nornagon - es ist unglaublich frustrierend, wenn die Frage ignoriert und die Antworten nicht verwandt sind. Auch ich interessiere mich einfach für Interessen willen! –

Antwort

18

Aus meiner Erfahrung:

  • Es ist inlining
  • Funktionsaufruf Overhead minimal ist (Inlining)
  • Was teuer ist riesig passieren Saiten zu Funktionen, da diese kopiert werden müssen und aus meiner Erfahrung ist V8 nicht immer so schlau wie es in diesem Fall sein könnte
  • Scope Lookup ist expens ive (Überraschung)
  • Machen Sie keine Tricks z. Ich habe einen binären Encoder für JS Object, etwas zusätzliche Leistung mit Bit Verschiebung dort (anstelle von Math.floor) neuesten Crankshaft (ja alpha, aber immer noch) läuft der Code 30% langsamer
  • Verwenden Sie keine Magie. eval, arguments.callee usw. Das beseitigt ziemlich jede Optimierung, da Code nicht mehr inline sein kann
  • Einige der neuen ES5-Sachen, z.B. .bind() ist wirklich langsam in V8 im Moment
  • Irgendwie new Object() und new Array() etwas schneller sind zur Zeit (MICROoptimization, es sei denn, Sie einige verrückte Encoder-Stick mit {} und [] gerade schreiben)

Meine Regeln:

  • schreiben guten Code
  • schreiben Arbeits Code
  • schreiben Code, der im Strict-Modus arbeitet (Unterstützung noch hat to land, aber wenn es eine weitere Optimierung tut kann durch V8 angewendet werden)

Wenn Sie ein JS-Experte sind und Ihr bereits alle good practices, um Ihren Code anwenden, gibt es kaum etwas, was Sie tun können, um die Leistung zu verbessern.

Wenn Sie Performance-Probleme auftreten:

  • Überprüfen sie
  • Ändern Sie den Code/Algorithmus
  • Und als letztes: Schreiben Sie eine C++ Erweiterung (und beobachten jeder verpflichten ry/node da niemand auf GitHub kümmert sich, ob einige interne Änderungen Build brechen)
+0

Danke - Javascript Garden sieht genial aus :) – nornagon

+0

Dies ist ein alter Post, aber ich bin vor kurzem auf ein nettes Video (von Google IO 2012) über genaue Sache gestoßen. Es wurde 2012 veröffentlicht, also haben sich die Dinge ein wenig geändert, aber ich denke nicht viel: http://youtu.be/UJPdhx5zTaw – Pijusn

0

Die docs geben eine große Antwort: http://code.google.com/apis/v8/design.html

+0

Die Dokumente sind nicht genug. zB: macht v8 Inlining? Wie teuer ist ein Funktionsanruf? Wie teuer ist das Erstellen eines Objekts? Ich möchte wissen, wie clever v8 in einer Vielzahl von Fällen ist, nicht nur bei Immobilienzugängen. – nornagon

0

Understanding V8 ist ein Satz von Folien aus nicht decamp.eu und gibt sehr interessante Tipps. Insbesondere fand ich die Hinweise zum Vermeiden des "Wörterbuchmodus" nützlich, d. H. Es hilft, wenn Sie die "Form" von Objekten konstant halten und ihnen keine willkürlichen Eigenschaften hinzufügen.

Sie sollen auch Knoten mit --crankshaft --trace-opt --trace-bailout laufen (die --crankshaft nur auf 64-Bit-Plattformen zum Beispiel OS X benötigt wird), um zu sehen, ob V8 „Bürgen“ auf Jiting bestimmte Funktionen sind. Es gibt eine Menge anderer Spurenoptionen einschließlich --trace-gc und verschiedene andere GC-Tracing, die für die Optimierung nützlich sein können.

Lassen Sie mich wissen, wenn Sie spezielle Fragen zu den Folien oben haben, da sie ein bisschen übersichtlich sind. :-) Sie gehören mir nicht, aber ich habe etwas über die Bereiche geforscht, die sie abdecken.