JetStream 3.0: A New Benchmark for Modern Web Performance

By ⚡ min read
<h2>Introduction</h2> <p>In a joint effort with Google and Mozilla, the WebKit team has unveiled JetStream 3.0, a major update to the widely used cross-browser benchmark suite. This release not only refreshes the test set but also introduces a fundamental shift in how we measure browser performance—especially for WebAssembly and large-scale web applications. While the broader announcement highlights the collaborative work, this article dives into the specific challenges the WebKit team tackled and the innovations in JavaScriptCore that drove the improvements.</p><figure style="margin:20px 0"><img src="https://webkit.org/wp-content/uploads/JS3-benchmark.png" alt="JetStream 3.0: A New Benchmark for Modern Web Performance" style="width:100%;height:auto;border-radius:8px" loading="lazy"><figcaption style="font-size:12px;color:#666;margin-top:5px">Source: webkit.org</figcaption></figure> <h2>Why a New Benchmark Was Necessary</h2> <p>Benchmarks are essential tools for browser engine developers to drive performance gains. However, the web evolves rapidly, and any benchmark can become outdated as new best practices emerge. When the most obvious optimizations are exhausted for a given benchmark, subsequent improvements tend to become highly specific to that workload rather than general. JetStream 3 addresses both issues—it refreshes the test suite and redefines how performance is measured, particularly in the context of WebAssembly and the increasing complexity of modern web applications.</p> <h2>Rethinking WebAssembly Performance Measurement</h2> <p>One of the most significant changes in JetStream 3 is the approach to WebAssembly (Wasm) workloads. To understand why, we must look back at the early days of Wasm.</p> <h3>The Evolution of Wasm in Benchmarks</h3> <p>When JetStream 2 was released, WebAssembly was still in its infancy. Early adopters were large C/C++ projects (like video games) that previously compiled to asm.js. These applications often had high one-time startup costs, but users tolerated them in exchange for high runtime throughput. Consequently, JetStream 2 measured Wasm performance in two distinct phases: <strong>Startup</strong> and <strong>Runtime</strong>.</p> <h3 id="infinity-problem">The Infinity Problem</h3> <p>Over the years, browser engines became remarkably efficient at instantiating WebAssembly modules. As startup times improved, the incentive to optimize even further grew. Shaving 0.1 ms off a 100 ms workload is negligible, but once engines reduced instantiation to just 2 ms, that same 0.1 ms improvement suddenly represented a 5% gain. In WebKit, the startup path was optimized so aggressively that for smaller workloads, startup time effectively reached zero seconds.</p> <p>In JetStream 2, each iteration’s time was computed using <code>Date.now()</code>, which rounds down to the nearest millisecond. When the measured time became 0 ms, the scoring formula <code>Score = 5000 / Time</code> returned infinity. This forced a patch in JetStream 2.2 that clamped the score to 5000. While an infinite score might seem like a victory, it actually indicated that browser engines had outgrown the Wasm subtests. On the modern web, Wasm is often in the critical path—used in libraries, image decoders, and UI frameworks—so a “zero” startup time in a microbenchmark no longer reflects real-world performance.</p> <h3>From Startup/Runtime to Real-World Workloads</h3> <p>JetStream 3 abandons the separate Startup and Runtime phases. Instead, it integrates Wasm workloads that mirror how the technology is actually used today: as part of the immediate rendering pipeline, not as separate offline compilation steps. This shift means the benchmark now captures the total cost of Wasm in a way that aligns with user experience—where every millisecond matters from page load to interaction.</p> <h2>Enhanced Scale and Scope</h2> <p>Modern web applications are larger and more complex than ever. JetStream 3 introduces tests that reflect this scale, including workloads that combine JavaScript, WebAssembly, and DOM interactions. The suite also includes larger data sets and more realistic scenarios, such as heavy image processing, real-time video effects, and complex UI frameworks. By pushing the boundaries of what a browser engine must handle, JetStream 3 ensures that optimizations remain general and beneficial to real users.</p> <h2>Implications for Browser Engines</h2> <p>The changes in JetStream 3 required significant engineering work across all major browser engines. For WebKit, the team focused on improving <strong>JavaScriptCore</strong> to better handle the new Wasm integration and larger-scale workloads. The result is not just faster scores, but more relevant performance metrics that help developers build better web experiences.</p> <h2>Conclusion</h2> <p>JetStream 3.0 marks a pivotal moment in web benchmarking. By addressing the infinity problem, shifting from artificial startup/runtime phases to holistic Wasm measurement, and scaling up to modern application workloads, the suite provides a more accurate and fair assessment of browser performance. As the web continues to evolve, benchmarks like JetStream 3 will help drive the next generation of optimizations—ensuring that users enjoy faster, smoother, and more capable web applications.</p>