Heute stellen wir eine neue WebKit JavaScript Benchmark Test Suite vor, JetStream. JetStream kodifiziert, was unser De-facto-Prozess war – Latenz- und Durchsatz-Benchmarks mit ungefähr gleicher Gewichtung zu kombinieren und sowohl Metriken traditioneller JavaScript-Programmierstile als auch neue JavaScript-basierte Technologien zu erfassen, die unsere Vorstellungskraft erfasst haben. Scores auf JetStream sind ein guter Indikator für die Leistung, die Benutzer in erweiterten Webanwendungen wie Spielen sehen würden.
Die Optimierung der Leistung unserer JavaScript-Engine hat für das WebKit-Projekt eine hohe Priorität. Beispiele für einige der Verbesserungen, die wir im letzten Jahr eingeführt haben, sind Concurrent Compilation, Generational GC und das FTL JIT. Die Entwicklung solcher Verbesserungen erfordert Konzentration: Wir versuchen, Projekte mit hohem Einfluss gegenüber der Erstellung und Pflege komplexer Optimierungen mit geringerem Nutzen zu priorisieren. Daher motivieren wir die Performance-Arbeit mit Benchmarks, die die Arten von Workloads veranschaulichen, denen WebKit-Benutzer wahrscheinlich begegnen werden. Diese Philosophie der Benchmark-getriebenen Entwicklung ist seit langem Teil von WebKit.
Der vorherige Stand des JavaScript-Benchmarking
Als wir Verbesserungen an der WebKit-JavaScript-Engine vornahmen, stellten wir fest, dass keine einzelne Benchmark-Suite vollständig repräsentativ für die Szenarien war, die wir verbessern wollten. Uns gefällt, dass JSBench die Leistung von JavaScript-Code auf beliebten Websites misst, aber WebKit schneidet bei diesem Benchmark bereits sehr gut ab. Wir mögen SunSpider wegen seiner Abdeckung häufig verwendeter Sprachkonstrukte und der Tatsache, dass seine Laufzeit repräsentativ für die Laufzeit von Code im Web ist, aber es reicht nicht aus, um den Spitzendurchsatz zu messen. Wir mögen Octane, aber es neigt sich zu weit in die andere Richtung: Es ist nützlich, um den Spitzendurchsatz unserer Engine zu bestimmen, ist aber nicht empfindlich genug für die Leistung, die Sie am wahrscheinlichsten bei typischen Web-Workloads sehen würden. Es spielt auch neuartige JavaScript-Technologien wie asm herunter.js; Nur einer der 15 Benchmarks von Octane war ein asm.js-Test, und dieser Test ignoriert die Gleitkommaleistung.
Gute asm finden.js Benchmarks ist schwierig. Obwohl Emscripten an Bedeutung gewinnt, sind seine Tests lang und bis vor kurzem fehlte ein Web-Harness. Also haben wir unser eigenes asm gebaut.erstellen Sie Benchmarks mithilfe von Tests aus der LLVM-Testsuite. Diese C- und C ++ – Tests werden von LLVM-Entwicklern verwendet, um Leistungsverbesserungen des Clang / LLVM-Compiler-Stacks zu verfolgen. Emscripten selbst verwendet LLVM, um JavaScript-Code zu generieren. Dies macht die LLVM-Testsuite besonders geeignet, um zu testen, wie gut eine JavaScript-Engine mit nativem Code umgeht. Ein weiterer Vorteil unserer neuen Tests ist, dass sie viel schneller ausgeführt werden können als die Emscripten-Testsuite.
Mit guten JavaScript-Benchmarks können wir selbstbewusst ehrgeizige Verbesserungen an WebKit verfolgen. Zum Beispiel führte SunSpider unsere gleichzeitige Kompilierungsarbeit, während der asm.js-Tests und Octanes Durchsatztests motivierten unsere Arbeit am FTL JIT. Es ist jedoch unpraktisch geworden, unsere Tests auf einem Sammelsurium dieser verschiedenen Benchmark-Suiten basieren zu lassen. Es ist schwierig, den Mitwirkenden zu sagen, was sie testen sollen, wenn es keine einheitliche Testsuite gibt, die ihnen sagen kann, ob ihre Änderung den gewünschten Effekt auf die Leistung hatte. Wir wollen eine Testsuite, die am Ende einen Score melden kann, und wir wollen, dass dieser Score repräsentativ für die zukünftige Richtung von WebKit ist.
Entwerfen der neuen JetStream Benchmark Suite
Verschiedene WebKit-Komponenten erfordern unterschiedliche Ansätze zur Leistungsmessung. Für die DOM-Leistung haben wir beispielsweise gerade den Tachometer-Benchmark eingeführt. In einigen Fällen funktioniert der offensichtliche Ansatz ziemlich gut: beispielsweise können viele Layout- und Rendering-Optimierungen durch Messen der Seitenladezeit auf repräsentativen Webseiten durchgeführt werden. Die Messung der Leistung einer Programmiersprachenimplementierung erfordert jedoch mehr Subtilität. Wir wollen die Sensibilität der Benchmarks für Core-Engine-Verbesserungen erhöhen, aber nicht so sehr, dass wir die Perspektive verlieren, wie sich diese Engine-Verbesserungen auf realen Websites auswirken. Wir möchten die Möglichkeit minimieren, dass Systemgeräusche unsere Messungen beeinträchtigen, aber jedes Mal, wenn eine Arbeitslast inhärent anfällig für Rauschen ist, möchten wir, dass ein Benchmark dies zeigt. Wir möchten, dass unsere Benchmarks eine High-Fidelity-Annäherung an die Workloads darstellen, die WebKit-Benutzer wahrscheinlich interessieren.
JetStream kombiniert eine Vielzahl von JavaScript-Benchmarks, die eine Vielzahl fortgeschrittener Workloads und Programmiertechniken abdecken, und meldet eine einzige Punktzahl, die sie anhand eines geometrischen Mittels ausgleicht. Jeder Test wird dreimal durchgeführt und die Ergebnisse werden mit 95% -Konfidenzintervallen gemeldet. Jeder Benchmark misst eine bestimmte Arbeitslast, und keine einzige Optimierungstechnik reicht aus, um alle Benchmarks zu beschleunigen. Einige Benchmarks weisen Kompromisse auf, und aggressive oder spezialisierte Optimierungen für einen Benchmark können einen anderen Benchmark verlangsamen. Das Aufzeigen von Kompromissen ist für unsere Arbeit von entscheidender Bedeutung. Wie in meinem vorherigen Beitrag über unseren neuen JIT-Compiler erläutert, versucht WebKit, sich mithilfe verschiedener Ausführungsebenen dynamisch an die Arbeitslast anzupassen. Aber das ist nie perfekt. Zum Beispiel, während unser neuer FTL JIT Compiler uns fantastische Beschleunigungen bei Spitzendurchsatztests gibt, verursacht es leichte Regressionen in einigen Ramp-up-Tests. Neue Optimierungen für fortgeschrittene Sprachlaufzeiten stoßen oft auf solche Kompromisse, und unser Ziel mit JetStream ist es, einen Benchmark zu haben, der uns über die Kompromisse informiert, die wir eingehen.
JetStream enthält Benchmarks aus den JavaScript-Benchmark-Suiten SunSpider 1.0.2 und Octane 2. Es enthält auch Benchmarks aus dem LLVM Compiler Open-Source-Projekt, kompiliert, um JavaScript mit Emscripten 1.13. Es enthält auch einen Benchmark, der auf der HashMap des Apache Harmony Open Source-Projekts basiert und von Hand in JavaScript übersetzt wurde. Weitere Informationen zu den in JetStream enthaltenen Benchmarks finden Sie auf der Seite JetStream In Depth.
Wir freuen uns, diesen neuen Benchmark vorstellen zu können. Um es auszuführen, besuchen Sie einfach browserbench.org/JetStream . Sie können Fehler gegen den Benchmark mit dem Bug-Management-System von WebKit unter der Komponente Tools / Tests einreichen.