使用 JägerMonkey 提升 JavaScript 性能

2008 年 8 月,Mozilla 推出了 TraceMonkey。这个新引擎在 Firefox 3.5 中发布,标志着下一代网页浏览器和网页应用性能新纪元的到来。在推出新引擎后不久,Google 推出了搭载 Chrome 的 V8。Apple 也发布了用于 Safari 的引擎,甚至 Opera 也在最新浏览器测试版中发布了新引擎。

这些新引擎的直接结果是出现了新的应用程序类型。人们开始尝试 将 Processing 带到网页,尝试 实时音频处理游戏 等。 (有关一些好的示例,请查看我们的 Canvas 演示 列表。)

Mozilla 在 JavaScript 引擎与这些新应用程序的交互方面学到了两点

  1. 我们采用的跟踪方法往往与某些代码风格的交互不佳。(例如,上面的 NES 游戏示例在我们引擎中的性能非常糟糕——它本质上是一个巨大的 switch 语句。)
  2. 当我们能够“保持跟踪” (稍后详细介绍) 时,TraceMonkey 比其他所有引擎都更出色。

Mozilla 的引擎从根本上与其他所有引擎不同:其他所有引擎都使用称为“基于方法的 JIT” 的方法。也就是说,它们接收所有传入的 JS 代码,将其编译为机器代码,然后执行。Firefox 使用“跟踪 JIT”。我们解释所有传入的 JS 代码,并在解释时进行记录。当我们检测到一个热路径时,我们将该路径转换为机器代码,然后执行该内部部分。(有关跟踪的更多 背景信息,请参阅去年的 hacks 中的这篇文章。)

跟踪 JIT 的缺点是我们必须在达到某些条件时在解释器和机器代码之间来回切换。当我们必须从机器代码跳转回解释器时,我们称之为“被踢出跟踪”。当然,解释器比运行原生机器代码要慢得多。事实证明,这种情况发生的频率比任何人预期的都要高。

因此,我们在第二代引擎中做的事情是将两种方法的最佳元素结合起来

  1. 我们使用 WebKit JS 引擎的一些代码块,构建了一个完整的基于方法的 JIT 来执行 JavaScript 代码。这应该让我们获得与其他引擎类似的快速基线 JS 性能。最重要的是,它将保持一致——不再需要在跟踪状态之间跳转,也不再需要在解释代码上花费大量时间。
  2. 我们将把我们的跟踪引擎连接到机器代码的后面,以生成用于内部循环的超快速代码。这意味着我们将能够在保持基于方法的 JIT 的一致性的同时,仍然拥有跟踪引擎的优势。

这项工作仍处于非常早期的阶段,目前甚至不值得进行演示,但我们认为有必要发布这篇文章,以便人们了解正在进行的基本内容。

您可以在 David MandelinDavid Anderson 的博客以及 新引擎的项目页面 中找到有关此内容的更多信息。


25 条评论

  1. Natanael L

    我想知道这个名字的由来。
    JägerMonkey?“Jäger” 听起来像是斯堪的纳维亚语 (我自己是瑞典人)。

    2010 年 3 月 1 日 下午 2:33

    1. Y

      喝了太多 Jägermeister…

      2010 年 3 月 1 日 下午 2:47

    2. Julian

      Jäger 是德语,意思是“猎人”。

      2010 年 3 月 1 日 下午 2:53

  2. Christopher Blizzard

    我不确定,但我怀疑其实是这个

    http://en.wikipedia.org/wiki/J%C3%A4germeister

    2010 年 3 月 1 日 下午 2:43

  3. Robert Stuart

    Jäger 在这里表示德语中的猎人:http://en.wikipedia.org/wiki/J%C3%A4ger

    2010 年 3 月 1 日 下午 3:18

  4. Klaus

    Jäger 是德语,意思是“猎人”。也许是在猎捕速度更快的 JS 引擎?!

    2010 年 3 月 1 日 下午 3:43

  5. Markus Popp

    Jäger 是德语中的猎人。

    2010 年 3 月 1 日 下午 4:34

  6. Chris Ainsley

    这真是个好消息。

    有两个问题

    这个新引擎的理论性能与 C++ 代码相比如何?

    您能评论一下动态音频生成 (例如模拟器或声音编辑网页应用所需的功能) 是否包含在 HTML5 规范草案中?

    2010 年 3 月 1 日 晚上 6:23

  7. WulfTheSaxon

    可能也是对 Chuck Yeager (第一个突破音障的飞行员) 的隐藏引用。

    2010 年 3 月 1 日 晚上 7:29

  8. Phil

    有没有关于它何时准备好的粗略估计?

    2010 年 3 月 2 日 上午 2:22

  9. BWRic

    这就是我喜欢开源的原因——能够使用竞争对手的代码来改进自己的产品。

    2010 年 3 月 2 日 上午 3:17

  10. Christopher Blizzard

    是的,为了清楚起见,我们只使用 WebKit 引擎中的一小部分代码。(与 V8 中的代码相比,它比较干净。)

    而且我们仍然使用旧 Tamarin 项目中名为 Nanojit 的一小部分代码。我们仍然与 Adobe 在这方面进行密切合作,共享大量代码和工作。

    因此,是的,看到我们实际上如何与其他浏览器合作编写代码,这很有趣。浏览器现在默认采用开源方式 (至少核心引擎是开源的)。在很多方面,这使得事情变得更容易。

    2010 年 3 月 2 日 下午 2:20

    1. Magne Andersson

      考虑到 Google Chrome 包含了多少来自其他浏览器的代码 (据我所知,很多来自 Mozilla 项目),我认为这是公平的代码交换 ;-)

      2010 年 3 月 7 日 上午 4:27

    2. Magne Andersson

      哎呀,它不是来自 V8 引擎。我猜无论如何它都是好的 ;p

      2010 年 3 月 7 日 上午 4:29

  11. mARK tWAIN

    这就可以解释为什么我的一些网站无法使用 java script ;) 我在 3.6 及更高版本中注意到了这一点。

    2010 年 3 月 3 日 上午 8:26

  12. […] Older Article […]

    2010 年 3 月 5 日 下午 1:29

  13. […] 关于我们前几天发布的 JägerMonkey (JM) 文章,有一些文章对技术细节理解有偏差 […]

    2010 年 3 月 8 日 下午 2:23

  14. […] 尽管调查回复对 Firefox 赞不绝口,但也有很多声音要求提高性能和稳定性。这些改进目前正在进行中,例如您可以看到 Firefox 启动时间和稳定性以及 JavaScript 性能方面的持续工作。 […]

    2010 年 5 月 19 日 上午 10:12

  15. […] JavaScript 引擎也快得多,尽管测试版 1 未包含新的 JaegerMonkey 工作。这项工作正在顺利进行,并将通过测试版过程发布,并且已经在 […]

    2010 年 7 月 1 日 下午 3:33

  16. 编写多个“else if” 语句是否有替代方法?…

    虽然编写 if/else if/else 语句有替代方法,但如果您希望从 JavaScript 中获得最佳性能,您可能需要坚持使用 if/else 语句 (请注意,我省略了“else if”)。我建议坚持使用这种策略的原因…

    2011 年 1 月 23 日 晚上 6:36

  17. jojo

    以上内容对于 fire fox 4 仍然适用吗?

    2011 年 5 月 7 日 下午 2:20

  18. Sarah Spicer

    我偶然发现了这篇文章。自从升级到 4.0 以来,Firefox 的稳定性一直有问题。启动速度变慢,页面卡住,我一直收到脚本消息,Facebook 在上面几乎无法运行。您能就我如何解决这个问题提供任何建议吗?我唯一能想到的就是尝试找到以前的 Firefox 版本并重新安装,以便回到没有这些问题的版本。
    如果您无法找到这里,请将所有信息发送到 Spicer46746@Roadrunner.com,我将不胜感激。感谢所有提供帮助的人。

    2011 年 5 月 29 日 上午 10:10

    1. louisremi

      您好,Sarah
      您可以先使用 Firefox Sync 保存您的书签和密码,然后使用配置文件管理器创建一个全新的配置文件。

      2011 年 5 月 30 日 上午 2:54

  19. Pablo Cuadrado

    您好!是否有 (或将要推出) 像 TraceVis 一样的性能监控器/可视化工具来配合最新的 JagerMonkey 引擎?

    2011 年 6 月 15 日 下午 1:12

  20. […] 关于我们前几天发布的 JägerMonkey (JM) 文章,有一些文章对技术细节理解有偏差 […]

    2012年3月3日 上午09:51

本文评论已关闭。