推出 JetStream 基准测试套件
今天,我们推出一个新的 WebKit JavaScript 基准测试套件,JetStream。JetStream 将我们事实上的流程规范化——将延迟和吞吐量基准测试以大致相等的权重结合起来,并捕获传统 JavaScript 编程风格以及激发我们想象力的新型基于 JavaScript 的技术的指标。JetStream 的得分是衡量用户在高级网络应用程序(如游戏)中看到性能的良好指标。
优化我们的 JavaScript 引擎性能是 WebKit 项目的重中之重。我们去年引入的一些改进包括并发编译、分代垃圾回收(GC)和FTL JIT。进行此类改进需要专注:我们努力优先考虑高影响力的项目,而不是构建和维护收益较小的复杂优化。因此,我们通过基准测试来推动性能工作,这些基准测试可以说明 WebKit 用户可能遇到的各种工作负载。这种基准驱动的开发理念长期以来一直是 WebKit 的一部分。
JavaScript 基准测试的先前状态
随着我们对 WebKit JavaScript 引擎的增强,我们发现没有一个单一的基准测试套件能够完全代表我们想要改进的场景。我们喜欢 JSBench 衡量 JavaScript 代码在流行网站上的性能,但 WebKit 在此基准测试上已经表现出色。我们喜欢 SunSpider,因为它涵盖了常用的语言结构,并且其运行时间代表了网络上代码的运行时间,但它在测量峰值吞吐量方面有所不足。我们喜欢 Octane,但它偏向另一个极端:它对于确定我们引擎的峰值吞吐量很有用,但对于您在典型网络工作负载中最可能看到的性能不够敏感。它还淡化了诸如 asm.js 等新颖的 JavaScript 技术;Octane 的 15 个基准测试中只有一个是 asm.js 测试,而且这个测试忽略了浮点性能。
找到好的 asm.js 基准测试很困难。尽管 Emscripten 正在获得关注,但其测试运行时间很长,而且直到最近才缺乏一个网络测试框架。因此,我们通过使用来自 LLVM 测试套件 的测试来构建我们自己的 asm.js 基准测试。这些 C 和 C++ 测试被 LLVM 开发者用于跟踪 clang/LLVM 编译器栈的性能改进。Emscripten 本身使用 LLVM 来生成 JavaScript 代码。这使得 LLVM 测试套件特别适合测试 JavaScript 引擎处理原生代码的能力。我们新测试的另一个好处是它们的运行速度比 Emscripten 测试套件快得多。
拥有良好的 JavaScript 基准测试使我们能够自信地追求对 WebKit 的雄心勃勃的改进。例如,SunSpider 指导了我们的并发编译工作,而 asm.js 测试和 Octane 的吞吐量测试则推动了我们对 FTL JIT 的工作。但是,让我们的测试基于这些不同基准测试套件的混杂集合已经变得不切实际。如果没有一个统一的测试套件可以告诉贡献者他们的更改是否对性能产生了预期效果,那么很难告诉他们应该测试什么。我们希望最终只有一个测试套件可以报告一个分数,并且我们希望这个分数能够代表 WebKit 的未来方向。
设计新的 JetStream 基准测试套件
不同的 WebKit 组件需要不同的性能测量方法。例如,对于 DOM 性能,我们刚刚引入了 Speedometer 基准测试。在某些情况下,显而易见的方法效果很好:例如,许多布局和渲染优化可以通过测量代表性网页的页面加载时间来驱动。但是,测量编程语言实现的性能需要更精细的方法。我们希望增加基准测试对核心引擎改进的敏感度,但又不能因此而失去对这些引擎改进在真实网站中表现的整体看法。我们希望最大限度地减少系统噪声干扰测量的机会,但只要工作负载本身容易产生噪声,我们都希望基准测试能体现出来。我们希望我们的基准测试能够高度准确地近似 WebKit 用户可能关心的工作负载。
JetStream 结合了各种 JavaScript 基准测试,涵盖了多种高级工作负载和编程技术,并使用几何平均数报告一个平衡它们的单一分数。每个测试运行三次,分数以 95% 置信区间报告。每个基准测试都测量不同的工作负载,并且没有单一的优化技术足以加速所有基准测试。一些基准测试会展示权衡,对一个基准测试进行激进或专门的优化可能会使另一个基准测试变慢。展示权衡对我们的工作至关重要。正如我在关于我们新 JIT 编译器的上一篇文章中讨论的那样,WebKit 尝试使用不同的执行层级动态适应工作负载。但这从来都不是完美的。例如,虽然我们新的 FTL JIT 编译器在峰值吞吐量测试中为我们带来了惊人的加速,但它确实在某些启动(ramp-up)测试中导致了轻微的性能下降。针对高级语言运行时的新优化常常会遇到此类权衡,我们使用 JetStream 的目标是拥有一个能告知我们正在做出的权衡的基准测试。
JetStream 包含来自 SunSpider 1.0.2 和 Octane 2 JavaScript 基准测试套件的基准测试。它还包括来自 LLVM 编译器开源项目的基准测试,这些基准测试使用 Emscripten 1.13 编译为 JavaScript。它还包含一个基于 Apache Harmony 开源项目 HashMap 的基准测试,该基准测试是手动翻译为 JavaScript 的。有关 JetStream 中包含的基准测试的更多信息,请访问 JetStream 深度解析 页面。
我们很高兴推出这个新的基准测试。要运行它,只需访问 browserbench.org/JetStream。您可以使用 WebKit 的错误管理系统在“工具/测试”组件下提交关于此基准测试的错误。