@babydragon
2017-04-25T19:49:19.000000Z
字数 2121
阅读 1859
前端
发布于2012年的Octane,是V8的基准测试引擎,其主要用于验证和优化V8引擎执行速度。但是由于Octane的测试结果和实际网页测试有所偏差,V8将不再使用Octane作为基准测试引擎。
发布于2012年的Octane,是V8的基准测试引擎,其主要用于验证和优化V8引擎执行速度。但是由于Octane的测试结果和实际网页测试有所偏差,V8将不再使用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分数,但是对运行真实网页有害的优化。不幸的是,这类问题在其他静态或者合成基准测试引擎(例如Kraken、JetStream)同样存在。简单地说,类似这些基准测试引擎无法有效的度量真实网页运行速度,并且可能让JavaScript虚拟机开发者针对一些特定场景做过度优化,最终导致通用场景下的性能下降。也正是在这种冲突下,V8团队决定不再使用Octane基准测试引擎。
Octane让JavaScript生态圈针对计算密集型进行了大量优化。接下来应该在提升真实网页速度上开疆扩土了,包括现代JavaScript库和框架、ES2015+语言特性、新状态管理模式、不可变对象分配和模块化打包等方面。由于V8使用才许多不同场景,包括服务端的Node.js,因此还需要加上针对服务端应用(例如AcmeAir)的性能度量。
目前V8引擎已经开始是使用真实数据进行性能度量,也期待V8团队能为用户和开发者提供更好的性能体验。