英文原帖地址:Comparison of JavaScript execution modes of the WebKit browser engine
现在,网页浏览器是使用最为广泛的软件工具。您会发现,无论是手机、平板电脑还是个人电脑,它们在各种设备上都得到广泛使用。所有浏览器的核心是浏览器引擎。我们(匈牙利赛格德大学软件工程系)为名为 WebKit 的著名浏览器引擎做出了长期贡献。我们致力于 WebKit 多个方面的工作,如 JavaScript 引擎、多核心支持、图形,以及构建和测试环境。在这篇博文中,我们将展示 JavaScript 引擎的多种不同执行模式,并对其性能进行比较。
JavaScriptCore
WebKit 的 JavaScript 执行引擎叫做 JavaScriptCore。它是一种性能分析虚拟机,支持各种优化级别。优化级别越高,提供的运行时性能越好,但代价是编译时间更长。每一优化级别对应一种执行模式。目前 JavaScriptCore 有三种执行模式。基本执行模式是 LLInt(低级别解释器)组件提供的解释执行模型。下一级别是 JIT(即时动态编译)编译器将 JavaScript 源代码转译为本机代码。最后一个执行模式也运用 JIT 编译器,但先对 JavaScript 源代码执行代价昂贵的优化,然后再转译成本机代码。
LLInt 在 2012 年 2 月取代了旧式 C++ 解释器。这一新方式可以在混合环境中的解释器和本机代码之间提供更好的交互。不过,LLInt 对于每种架构(如 ARM)要求特定于 CPU 的后端。如果后端不可用,它将回复到基于 C++ 的实施(名为 CLoop)。此模式仅建议在万不得已的时候使用,因为它与后续执行模式不兼容。
当 JavaScript 函数的调用达到一定阈值时,函数将被 JIT 编译器转译为机器代码。下一次调用该函数时将执行此机器代码。
当给定函数执行了很多次后,该函数由 DFG-JIT(数据流图JIT)编译器重新编译。此编译器根据在前面执行该函数的过程中收集的性能分析数据,执行激进的优化。
所有这些执行模式都受 JavaScriptCore 的 ARM 端口支持。我们深入参与了这一端口的开发,并且负责提供 JavaScriptCore 的 ARM-Linux 支持。在前几个月中,我们完成了针对 ARM 指令集的 LLInt 和 DFG-JIT 支持,下表提供它们在 ARM 和 Thumb2 指令集中的性能比较。
下面这些数据显示了这些执行模式组合的比较。CLoop 和 LLInt 是纯解释模式,而 JIT 则代表所有 JavaScript 源代码编译成本机代码的模式。其余部分都是组合了 LLInt、JIT 和 DFG-JIT 的混合模式。我们通过三个著名基准测试集合测量了这些执行模式,它们是 SunSpider、V8 和 WindScorpion。除了绝对执行时间外,也显示了与 ARM 版 CLoop 相比的相对速度增值;当然,值越高表示结果越好。
正如我们从这些数据看到的,启用更加复杂的优化可以改善所有基准测试集合上的执行,但加速程度大不相同。最高的飞跃可以在 V8 基准测试集合上看到,而最后两种模式的速度几乎是参考值的 10 倍。这并不令人惊讶,因为 V8 基准测试上的执行速度曾经是近期 JavaScriptCore 开发的重点。
至于两个 ARM 指令集,无一比对方绝对快,但 Thumb-2 总体上稍有优势。所以,两种方案都是任何设备的合理选择。
我们利用 WebKit (r146983) 的 Qt 端口,在 Odroid-X2(ARM CortexTM-A9 四核 1.7Ghz 2GB 内存)平板(带 Ubuntu Linaro 12.11 系统)上进行了这些测量。
来宾博客作者:
Gabor Rapcsanyi 是匈牙利塞格德大学软件工程系的一名开发人员。他是 WebKit 开源浏览器引擎(提交者身份)的贡献者。他拥有计算机科学理学硕士学位。
ARM 欢迎 ARM 互联社区 (CC) 的众多合作伙伴提交来宾博客,这些博客内容将在我们多个社区博客上发表。如果您有兴趣参与,请将咨询问题通过电邮发至 Tell.Us@arm.com。
ARM 互联社区 (CC) 是一个广泛的生态系统,涵盖了基于 ARM 处理器设计的各个方面,从芯片实现到系统及设备设计。CC 是一个合作创新的平台,提供多种类型的论坛,供成员彼此合作,接触客户,解决行业面临的挑战,令设计人员可以关注各种功能,缩短 ARM Powered 解决方案的上市时间。