你浏览器的 JavaScript 引擎有多快?八项固定负载——字符串、正则表达式、数学运算、排序与查找、递归、素数筛、JSON 和数组处理——所有访问者的工作量相同,依次运行。总用时越短越好。
直接测量 JavaScript 引擎的历史,比建立在它之上的大多数 Web 平台功能都要久远:WebKit 的 SunSpider 和 V8 的 Octane 在 2010 年代的大部分时间里是浏览器厂商互相比较的数字,最终两者都被淘汰,因为引擎变得如此之快,而且越来越善于识别基准测试式的代码,以至于得分不再反映真实网页的使用感受。这个基准测试沿用了它们的形式,而不是它们确切的测试代码:一组小巧、自成一体的负载,每一项都被选来考验引擎的不同部分,连续运行并作为整体测量。
八项负载依次运行:构造并转换一个长字符串;用多个正则表达式匹配一段生成的段落文本;数百万次三角函数和对数函数调用;对二十万个数字排序,然后用二分查找检索结果;不带记忆化的递归斐波那契调用,它考验的是函数调用开销而不是算术;在三百万个整数上用类型化数组做埃拉托色尼筛法;通过 JSON 编码并解码一个相当大的对象树;以及在五十万个数组元素上进行 filter–map–reduce 链式处理。凡是需要随机性的负载都使用带种子的伪随机数生成器,因此每位访问者的输入完全相同。
得分是八项负载合计的实际用时(毫秒),用 performance.now() 测量:越低越好。上方的表格会随着每项负载的完成逐步填入其用时,方便你看出引擎的某一部分是否比其余部分异常地快或慢。所有内容都在单线程上运行,也没有预热环节,因此首次访问与之后的访问可能因引擎优化器在运行中途介入而略有差异:这与真实网页遇到的波动是一样的。