V8 不再使用基准测试引擎 Octane

2017 年 4 月 26 日

发布于 2012 年的 Octane,是 V8 的基准测试引擎,其主要用于验证和优化 V8 引擎执行速度。但是由于 Octane 的测试结果和实际网页测试有所偏差,V8 将不再使用 Octane 作为基准测试引擎。

Octane 的起源

JavaScript 基准测试引擎是一段不断进化的历史。随着网页从原始静态页面到现在富客户端应用,都需要基准测试引擎能够与时俱进。 SunSpider 是其中比较早的基准测试引擎,它为快速优化 JavaScript 提供了基础。但是,随着虚拟机开发者意识到微基准测试的局限性,基准测试引擎随之更新,针对SunSpider 的短板进行优化,同时浏览器社区也将SunSpider 从推荐基准测试引擎中剔除

Octane 基准测试套件最早发布于 2012 年,旨在减轻早期微基准测试引擎的一些缺陷。它源于 V8 的早期简单测试用例,最终成为通用网页性能的基准测试。Octane 包含17 个不同的测试集,以覆盖各种不同的工作场景。Octane 的内容代表它创建时度量JavaScript 性能的主流方式。

收益递减和过度优化

在Octane 最初发布的几年中,它为JavaScript 虚拟机生态提供了独特的价值。它使得JavaScript 引擎(包括V8),能够在峰值压力下优化执行性能。这些CPU 敏感型工作场景,是JavaScript 虚拟机最初实现时的弱项。Octane 帮助引擎开发者针对计算密集型应用程序进行调优,执行速度的提升也促使JavaScript 成为C++ 语言和Java 语言之外的另一种选择。另外,Octane 也帮助提高了垃圾回收的性能,规避浏览器过长时间等待或意外卡顿。

然而到了2015 年,大部分JavaScript 引擎都针对Octane 进行编译器优化,以获取更高基准测试得分。一些优化使得Octane 基准测试分数大大提升,但是针对真实网页却几乎没有什么效果。深入研究执行Octane 基准测试和加载普通网站(如Facebook、Twitter 等)发现,基准测试运行时没有执行V8 的源码解析或者浏览器的加载流程,而真实网页会必须要执行。此外,Octane 中的JavaScript 不符合目前大部分主流框架和库文件使用的语法和格式(更不用说经过转换的代码或者最新的ES2015+ 语言特性)。这意味着使用Octane 来度量V8 性能的时候,并没有针对现代网页框架相关的用例,例如这些框架的加载速度度量,新状态管理模式的对比度量,亦或是 ES2015+ 特性和 ES5 等效代码执行速度对比等。

不仅如此,还出现了一些在真实场景下没有任何帮助,甚至起到反作用的优化。例如根据 Octane 基准测试得分,建议将 JavaScript 代码聚合和内联,以减少函数调用成本。但是聚合策略仅仅是为 Octane 基准测试评分打造的,在现实场景下会导致编译成本上升和更多的内存开销。一些场景的性能优化对真实网页所有帮助,但为了实现这些性能提升,必须要求开发者按照特定方式编码,而在通用场景下却没有什么效果。一些面向 Octane 的优化对类似Ember 等现代框架还可能导致性能下降。 instanceof操作符就是一个很好的例子,它的优化方案局限在 Octane 特定的情况,而没有针对 Node.js 应用程序进行回归测试

另外一个问题是,随着时间的推移,一些 Octane 本身的小 bug 会大大影响优化结果。例如在 Octane 中的 Box2DWeb 基准测试利用了使用<>=操作符比较对象的 bug ,使得性能提升大约 15%。而在这项优化在真实网页中没有效果,还会使得针对一般类型的比较变得更加复杂。其他 JavaScript 虚拟机开发者还发现,一些针对Octane 的优化在真实网页场景下会起到反效果:例如懒解析技术能够帮助大部分真实网页提高加载速度,并增加无效代码的发现率,但是该技术在Octane 基准测试中却处于不利位置。

Octane 和其他合成基准测试引擎之后

前面列举了几个可以提高 Octane 分数,但是对运行真实网页有害的优化。不幸的是,这类问题在其他静态或者合成基准测试引擎(例如 Kraken JetStream )同样存在。简单地说,类似这些基准测试引擎无法有效的度量真实网页运行速度,并且可能让 JavaScript 虚拟机开发者针对一些特定场景做过度优化,最终导致通用场景下的性能下降。也正是在这种冲突下,V8 团队决定不再使用 Octane 基准测试引擎。

Octane 让 JavaScript 生态圈针对计算密集型进行了大量优化。接下来应该在提升真实网页速度上开疆扩土了,包括现代JavaScript 库和框架 ES2015+ 语言特性、新状态管理模式、不可变对象分配模块化打包等方面。由于V8 使用才许多不同场景,包括服务端的Node.js,因此还需要加上针对服务端应用(例如 AcmeAir )的性能度量。

目前 V8 引擎已经开始是使用真实数据进行性能度量,也期待V8 团队能为用户和开发者提供更好的性能体验。


感谢刘振涛对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017 年 4 月 26 日 19:001043

评论

发布
暂无评论
发现更多内容

食堂就餐卡系统架构设计

Cloud.

食堂就餐卡系统设计

stardust20

随遇而安的适配器模式 | Spring 中的适配器

海星

Java spring 面试 设计模式 Java 25 周年

架构设计文档学习总结

jason

架构师训练营第一周学习总结

不谈

ARTS-week3

王钰淇

ARTS 打卡计划

虽则悲欢不尽相同

zhoo299

随笔

食堂就餐卡系统设计

wyzwlj

极客大学架构师训练营

第三季已经起航,送你一份活动手册吧

赵新龙

写作 社群

第01周命题作业-食堂就餐卡系统架构设计

Jaye

极客大学架构师训练营

架构训练营-第一课总结

如何成为一个架构师

_MISSYOURLOVE

极客大学架构师训练营

重新定义失败

史方远

个人成长 随笔杂谈

程序员如何破除「迷茫」

顿晓

学习 程序员 架构 迷茫

C02-商业模式与架构设计

吴传卜

第一周总结

芒夏

极客大学架构师训练营

Week 01 命题作业

卧石漾溪

极客大学架构师训练营

学习总结

Geek_2e7dd7

UML练习1-食堂就餐卡系统设计

一剑

架构师训练营第一周总结

Cloud.

极客大学架构师训练营

作业一:食堂就餐卡系统设计

Geek_36d3e5

架构师0期 | 架构师是怎样炼成的?

刁架构

极客大学架构师训练营

架构师训练营-第一课学习总结

King

学习 感悟 极客大学架构师训练营

机器学习复习-线性回归

JustBuyIt

学习 线性回归

食堂就餐卡系统设计

赵龙

架构师思维

林昱榕

极客大学架构师训练营

架构训练营-食堂就餐卡管理系统

食堂就餐卡系统设计

李广富

平台化服务的基石:隔离与交互策略模型

孤岛旭日

企业架构 用户权限 权限系统

ReentrantLock 公平锁和非公平锁源码分析

张sir

Java 多线程 Java 25 周年

架构师训练营 第一周 学习总结

一雄

学习 极客大学架构师训练营 第一周

V8 不再使用基准测试引擎 Octane-InfoQ