Wei Wu / @lazyparser

PLCT Lab. OSDT/HelloGCC/HelloLLVM. RISC-V Ambassador.

Download as .zip Download as .tar.gz View on GitHub

注:本文是对David Anderson这篇博客文章的翻译。David介绍了IonMonkey的性能提升的内部架构,同时表示将在未来几周写更多的文章介绍IonMonkey。本博客将持续关注并翻译。

今天我们在Firefox 18中启用了我们最新的JavaScript JIT编译器,IonMonkey。IonMonkey不仅对JavaScript的执行性能有很大的提高,也是我们的编译器架构有了很大的进步。IonMonkey花费了超过一年的时间开发,我们都超级兴奋。

SpiderMonkey跟JIT的关系源远流长,但是你会发现SpiderMonkey的JIT编译器中缺少一个现代编译器,例如Java或C++编译器中都有的步骤。无论是老的TraceMonkey(作者注1)还是新的JaegerMonkey,都基本上是直接把JavaScript(从字节码)翻译到机器码。没有中间步骤,所以编译器也就没有办法看到翻译的结果,也就无法进一步的优化它们。

IonMonkey提供了一个全新的框架,使得我们可以做到这一点。它可以分成以下三步:

  1. 将JavaScript翻译成中间表示(IR);
  2. 运行多种算法优化IR;
  3. 将IR翻译成机器码。

让我们开心的不仅仅是性能和可维护性的提升,而且使得未来的JS编译器研究更加的简便。现在,有了IonMonkey,你就能够写一个新的优化,插入到流水线中,看看效果如何了。(译注:估计是受到了LLVM的启发?)

性能测试

IonMonkey针对的是长时间运行的程序,对于短程序还是用JaegerMonkey。我(David Anderson)在我跑着Windows 7专业版的MAC Pro笔记本上(译注1)运行了Google的V8基准测试和Kraken基准测试,性能提升了26%。Firefox 17运行了2602ms,Firefox 18运行了1921ms。效果如下图所示,越高越好。

[caption id=”attachment_323” align=”aligncenter” width=”300”]IonMonkey-Kraken-result Kraken基准测试结果[/caption]

Google V8测试上Firefox 15得分为8474,Firefox 17得分为9511.Firefox 18得分最高,为10188,比Firefox 17快7%,比Firefox 15快50%。

[caption id=”attachment_324” align=”aligncenter” width=”300”] V8基准测试结果[/caption]

我们还有很多的工作需要去做。未来的一段时间我们将继续对IonMonkey进行测试,包括基准测试和真实的程序。

团队

对于我们而言IonMonkey最酷的部分就是我们是一个高度协作的团队。2011年6月的时候我们创建了一个大概的计划,然后估计大概需要一年的时间完成。我们招了四个实习生——Andrew Drake, Ryan Pearl, Andy ScheFirefox , 和 Hannes Verschore ——他们都参与实现了IonMonkey的核心组件,现在代码库中还有他们的代码。

2011年8月下旬我们开始组建全职团队,包括Jan de Mooij, Nicolas Pierron, Marty Rosenberg, Sean Stangl, Kannan Vijayan,还有我自己。(还有原SpiderMonkey开发者Chris Leary,2012年暑期实习生Eric Faust)。过去一年中我们齐头并进,搭出了总体的架构,确保其设计和代码质量都达到了最好,并且确实提升了JS的性能。

感谢我们所有的团队成员,大家为了一个目标一起合作的感觉太棒了。

技术

未来的几周我们将会发一些帖子介绍IonMonkey的主要组成以及工作原理。简而言之我将着重介绍IonMonkey中现有的优化技术:

另外,我想指出IonMonkey能够运行在所有的Tier-1平台(译注3)上。编译器架构在设计上考虑了平台移植性的问题,大多数平台无关的代码都被抽取了出来,基本上只有汇编器是需要平台相关的。我们对此深感自豪。

何时,何地?

IonMonkey将在Firefox 18默认开始,Firefox 18现在是Firefox Nightly状态,将在10月8号变成Aurora,在11月10号进入beta版本。

作者注1:TM其实是有一个中间层额,但是能力非常的有限(limited),无法处理after-the-fact类型的优化。

译者注1:这个配置,想起来“普通青年Thinkpad+Windows,文艺青年Mac Pro + Mac OS……”

译者注2:参见Ryan Pearl和Michael Sullivan的这篇论文(PDF)

译者注3:Tier-1平台包括以下配置