Frage

Es gibt eine Menge Kapital C, Kapital S Wissenschaft Computer geht in Javascript über die Tracemonkey, Squirrelfish und V8-Projekte. Führen Sie einen dieser Projekte (oder andere) adressiert die Leistung von DOM-Operationen, oder sind sie rein Javascript Berechnung verwendet?

War es hilfreich?

Lösung

Die Leistung der reinen DOM-Operationen (getElementByld / Tagname / Selector, nextchild, usw.) sind nicht betroffen, wie sie sind bereits in reinem C ++.

Wie die JS-Engine Verbesserungen Leistung bewirken in einem Ausmaß von den speziellen Techniken für die Leistungsverbesserungen verwendet abhängt, sowie die Leistung der DOM-> JS Brücke.

Ein Beispiel für ersteres ist Tracemonkey Abhängigkeit von allen Anrufen zu JS-Funktionen zu sein. Da eine Spur inlines effektiv dem Weg der Ausführung beliebigen Punkt, wo die JS-Code trifft, die nicht inline sein können (native Code, true polymorphe Rekursion, Exception-Handler) die Spur abgebrochen und die Ausführung fällt zurück auf den Dolmetscher. Die TM-Entwickler tun ziemlich viel Arbeit, um die Menge an Code zu verbessern, die (einschließlich Umgang mit polymorphen Rekursion) zurückgeführt werden kann jedoch realistisch über Anrufe zu beliebigen nativen Funktionen Tracing (zB. Das DOM) nicht möglich ist. Aus diesem Grund glaube ich, sie bei der Umsetzung mehr des DOM in JS suchen (oder zumindest in einem JS freundlich). Das heißt, wenn der Code ist rückverfolgbar TM kann eine außergewöhnlich gute Arbeit tun, wie es die meisten „Objekte“, um effizienter zu senken und / oder native Äquivalente (z. B. Maschinen ints anstelle der JS Nummer Implementierung verwenden).

Javascript (das ist, wo SquirrelFish Extreme lebt) und V8 haben einen ähnlichen Ansatz, dass sie beide JIT alle JS-Code sofort und Code erzeugen, der mehr spekulativ ist (z. B. wenn Sie a*b tun sie Code erzeugen, a übernimmt und b sind Zahlen und fällt zurück langsam Code zu außergewöhnlich, wenn sie nicht sind). Dies hat eine Reihe von Vorteilen gegenüber Verfolgung, nämlich, dass Sie die gesamten Code JIT können, unabhängig davon, ob es nennt nativen Code / wirft Ausnahmen, etc, was bedeutet, ein einzelner DOM Anruf nicht die Leistung zerstören wird. Der Nachteil ist, dass der gesamte Code spekulativ ist - TM wird Inline-Anrufe Math.floor, etc, aber die beste JSC / V8 kann a=Math.floor(0.5) wäre äquivalent zu tun -> a=(Math.floor == realFloor) ? inline : Math.floor(0.5) diese Kosten sowohl in der Leistung und Speichernutzung, es ist auch nicht besonders machbar. Der Grund dafür ist die vorne Kompilation, während TM nur Code JITs, nachdem es laufen (und so genau weiß, welche Funktion aufgerufen wurde) JSC und V8 haben keine wirkliche Grundlage eine solche Annahme zu machen, und im Grunde erraten müssen (und zur Zeit weder Versuche diese). Das einzige, was V8 und JSC tun für dieses Problem, um zu versuchen und zu kompensieren, ist zu verfolgen, was sie in der Vergangenheit gesehen haben und übernehmen, in den Weg der Ausführung, die beide eine Kombination von Techniken verwenden, um dieses Caching zu tun, in besonders heißen Fällen sie umschreiben kleine Teile des Befehlsstroms, und in anderen Fällen sie halten aus Band-Caches. wenn Sie Code Allgemein gesprochen haben, das lautet

a.x * a.y

V8 und JSC wird die ‚implizite Typ‘ überprüfen / ‚Struktur‘ zweimal - einmal für jeden Zugriff und dann prüfen, ob a.x und a.y beide Zahlen sind, während TM wird Code erzeugen, der die Art von a prüft nur einmal, und (ceteris paribus) nur multiplizieren a.x und a.y, ohne zu überprüfen, dass sie Zahlen.

Wenn Sie sich bei reiner Ausführungsgeschwindigkeit gerade etwas von einer gemischten Tasche ist wie jeder Motor auf bestimmten Aufgaben besser zu machen scheint als andere - Tracemonkey gewinnt in vielen reinen Mathematik-Tests, gewinnt V8 in stark dynamischen Fällen JSC gewinnt, wenn es eine Mischung ist. Natürlich, während die heute morgen kann es nicht sein, wahr sind, wie wir alle hart zur Verbesserung der Leistung zu arbeiten.

Die andere Frage, die ich erwähnt war der DOM <-> JS Bindungskosten - dies eine sehr bedeutende Rolle in Web-Performance, das beste Beispiel dafür ist Safari 3.1 / 2 vs Chrome am Dromaeo Benchmark tatsächlich spielen kann. Chrome basiert der Safari 3.1 / 2 Zweig der WebKit ab, so dass es ziemlich sicher ist ähnlich DOM zu übernehmenLeistung (Compiler Unterschied könnte eine gewisse Abweichung verursachen). In dieser Benchmark Safari 3.1 / 2 tatsächlich schlägt Chrome trotz einen JS Motor hat, die eindeutig viel viel langsamer ist, das ist im Grunde durch effizientere Bindungen zwischen JSC / WebCore (dem dom / Rendering / etc von WebKit) und V8 / WebCore

Zur Zeit bei TM DOM Bindungen suchen scheint ungerecht, da sie die ganze Arbeit noch nicht abgeschlossen hat sie tun wollen (leider) so fallen sie einfach wieder auf dem Dolmetscher: - (

..

Errmmm, die etwas länger ging als vorgesehen, so kurze Antwort auf die ursprüngliche Frage ist „es kommt“: D

Andere Tipps

Sie sind reine JavaScript. Es sei denn, ein bestimmtes DOM Methodenaufruf implementiert in JS, werden sie wenig Wirkung haben (nicht zu sagen, hat sich auf die Verringerung der Overhead nicht gewesen Arbeit solcher Anrufe jedoch ).

DOM-Optimierung ist ein ganzer ‚nother Kessel Eichhörnchen Affen Spinnen Fisch ... Das Layout und sogar Rendering-Engines ins Spiel kommen, und jeder Browser hat ihre eigene Implementierung und Optimierungsstrategie.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top