BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 金灵杰 关注 5 他的粉丝 发布于 2017年4月27日. 估计阅读时间: 6 分钟 | GMTC大前端的下一站,PWA、Web框架、Node等最新最热的大前端话题邀你一起共同探讨。

发布于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团队能为用户和开发者提供更好的性能体验。


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

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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT