2017年4月26日星期三

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


Linuxeden 开源社区 --

作者 金灵杰         

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

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

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

转自 http://ift.tt/2pjVoqC

The post V8 不再使用基准测试引擎 Octane appeared first on Linuxeden开源社区.

http://ift.tt/2pAWdhR

没有评论:

发表评论