Firefox 3.6 中的 JavaScript 速度提升

这篇文章由 Mozilla JavaScript 团队的 David Mandelin 撰写。

Firefox 3.5 引入了 TraceMonkey,我们新的 JavaScript 引擎,它可以跟踪循环并将它们 JIT 编译为原生 (x86/ARM) 代码。与 Firefox 3 相比,许多 JavaScript 程序在 TraceMonkey 中运行速度提高了 3-4 倍。(有关技术细节,请参阅我们的 上一篇文章。)

对于 Firefox 3.6 中的 JavaScript 性能,我们重点关注我们认为最需要改进的领域。

  • 某些 JavaScript 代码在 Firefox 3.5 中未进行跟踪编译。默认情况下,Firefox UI JavaScript 和附加组件 JavaScript 禁用了跟踪,因此这些程序无法从跟踪中获益。此外,许多高级 JavaScript 功能也未进行跟踪编译。对于 Firefox 3.6,我们希望跟踪更多程序和更多 JS 功能。
  • 使用 JavaScript 编写的动画通常会由于垃圾回收暂停而变得卡顿。我们希望提高 GC 性能,以缩短暂停时间并使动画更流畅。

在本文中,我将解释 Firefox 3.6 附带的最重要的 JS 性能改进。我将重点介绍哪些类型的 JS 代码运行速度更快,包括展示 Fx3.6 对 Fx3.5 进行的改进的示例程序。

浏览器 UI JavaScript 的 JIT

Firefox 在两种上下文中运行 JavaScript 代码:内容chrome(与 Google Chrome 无关)。网页内容的一部分的 JavaScript 在内容上下文中运行。浏览器 UI 或浏览器附加组件的一部分的 JavaScript 在chrome上下文中运行,并且具有额外的权限。例如,chrome JS 可以更改主浏览器 UI,但内容 JS 不允许这样做。

可以使用 about:config 分别为内容和 chrome JS 启用或禁用 TraceMonkey JIT。由于影响 chrome JS 的错误对安全性和可靠性构成了更大的风险,因此在 Firefox 3.5 中,我们选择默认情况下禁用 chrome JS 的 JIT。经过广泛的测试,我们决定默认情况下启用 chrome JS 的 JIT,这是我们在 Fx3.5 中没有时间充分调查的事情。为 chrome 启用 JIT 应该会使 Firefox UI 和附加组件背后的 JS 运行速度更快。对于一般的浏览器使用,这种差异可能不太明显,因为 UI 是为了在旧的 JS 引擎中表现良好而设计和编码的。对于执行大量 JS 计算的附加组件,这种差异应该会更加明显。

选项

Fx3.5 默认值

Fx3.6 默认值
javascript.options.jit.chrome

false

true
javascript.options.jit.content

true

true
JIT 的 about:config 选项

垃圾收集器性能

JavaScript 是一种垃圾回收语言,因此 JavaScript 引擎必须定期回收未使用的内存。我们的垃圾收集器 (GC) 在其工作时会暂停所有 JavaScript 程序。只要暂停时间“短”,这都没问题。但是,如果暂停时间过长,即使只是一点点,也会导致动画变得卡顿。动画需要以每秒 30-60 帧的速度运行才能看起来流畅,这意味着渲染一帧的时间不应超过 17-33 毫秒。因此,超过 40 毫秒的 GC 暂停会导致卡顿,而低于 10 毫秒的暂停几乎不会被察觉。在 Firefox 3.5 中,暂停时间明显过长,并且 JavaScript 动画在网络上越来越常见,因此减少暂停时间是 Firefox 3.6 中 JavaScript 的主要目标。

演示:GC 暂停和动画

演示。
此处显示的旋转刻度盘动画说明了暂停时间。除了为刻度盘设置动画外,此演示还每秒创建一个百万个 100 个字符的字符串,因此它需要频繁进行 GC。帧延迟计量器以毫秒为单位提供帧之间的时间平均值。估计的 GC 延迟计量器提供估计的 GC 延迟的平均值,基于以下假设:如果一帧的延迟是平均延迟的 1.7 倍或更多,则该帧期间正好运行了一个 GC。(此过程可能对其他浏览器无效,因此不适用于比较不同的浏览器。还要注意,GC 时间也取决于其他活动的 JavaScript 会话,因此要直接比较两个浏览器,请在每个浏览器中打开相同的选项卡。)在我的机器上,我在 Fx3.5 中获得的估计 GC 延迟约为 80 毫秒,但在 Fx3.6 中仅为 30 毫秒。

但是,通过在 Fx3.5 中打开演示,观看一段时间,然后在 Fx3.6 中尝试它,可以更容易地看到差异。
在 Fx3.5 中,我看到频繁的暂停,并且动画看起来明显卡顿。在 Fx3.6 中,它看起来非常流畅,我甚至很难准确地判断 GC 何时运行。

Fx3.6 如何做得更好。我们对垃圾收集器和内存分配器进行了许多改进。我想提供一些关于真正缩短暂停时间的两个主要更改的技术细节。

首先,我们注意到很大一部分暂停时间花在了调用 free 以回收未使用的内存上。我们无法做太多事情来加快释放内存的速度,但我们意识到可以在单独的线程上执行此操作。在 Fx3.6 中,主 JS 线程只需将未使用的内存块添加到队列中,另一个线程在空闲时间或在单独的处理器上释放它们。这意味着具有 2 个或更多内核的机器将更多地受益于此更改。但即使只有一个内核,释放也可能会延迟到空闲时间,此时它不会影响脚本。

其次,我们知道在 Fx3.5 中运行 GC 会清除 JIT 编译的所有原生代码以及一些其他加速 JS 的缓存。原因是跟踪 JIT 和 GC 彼此之间并不了解,因此如果 GC 运行,它可能会回收已编译跟踪正在使用的对象。结果是,在 GC 之后,JS 运行速度会稍微慢一些,因为缓存和已编译的跟踪会被重新构建。这将被体验为扩展的 GC 暂停或 GC 暂停后动画的短暂卡顿。在 Fx3.6 中,我们教会了 GC 和 JIT 协同工作,现在 GC 不会清除缓存或清除原生代码,因此它在 GC 后立即恢复正常运行。

跟踪更多 JavaScript 结构

在我的 关于 Fx3.5 版本的 TraceMonkey 的文章 中,我注意到某些代码结构(例如 arguments 对象)没有被跟踪,并且没有从 JIT 获得性能改进。Fx3.6 中 JS 的主要目标是跟踪更多内容,以便更多程序可以运行得更快。我们现在确实跟踪了更多内容,特别是

  • DOM 属性。DOM 对象是特殊的,并且对于跟踪编译器而言更难以处理。对于 Fx3.5,我们实现了对 DOM 方法的跟踪,但没有跟踪 DOM 属性。现在我们也跟踪 DOM 属性(以及其他“原生”C++ getter 和 setter)。我们仍然不跟踪脚本化的 getter 和 setter。
  • 闭包。Fx3.5 只跟踪了涉及闭包的一些操作(我的意思是引用在词法上封闭函数中定义的变量的函数)。Fx3.6 可以跟踪使用闭包的更多程序。目前尚未跟踪的主要操作是创建修改闭包变量的匿名函数。但是,调用此类函数以及实际写入闭包变量会被跟踪。
  • arguments我们现在跟踪 arguments 关键字的大多数常见用法。“奇特”用法(例如设置 arguments 的元素)不会被跟踪。
  • switch我们改进了跟踪使用密集打包的数字 case 标签的 switch 语句时的性能。这些对于模拟器和 VM 尤其重要。

这些改进对于 jQuery 和 Dromaeo 尤其重要,它们大量使用了 arguments、闭包和 DOM。我怀疑许多其他复杂的 JavaScript 应用程序也将从中受益。例如,我们最近从作者那里听说 此 R 树库 在 Fx3.6 中的性能要好得多。

以下是一对我们跟踪的新事物的演示。第一个在循环中设置 DOM 属性。第二个调用使用 arguments 实现的 sum 函数,我在 Fx3.6 与 Fx3.5 中都获得了大约 2 倍的速度提升。

演示:Fx3.6 跟踪 DOM 属性和 arguments


DOM 属性设置:

使用 arguments 求和:

字符串和正则表达式改进

Fx3.6 包括对字符串和正则表达式性能的若干改进。例如,regexp JIT 编译器现在支持更大类别的正则表达式,包括广受欢迎的 w+。我们还加快了一些基本操作的速度,例如 indexOfmatchsearch。最后,我们使在函数内部连接多个字符串序列(构建 HTML 或其他类型的文本输出的常见操作)的速度快得多。

关于我们如何使字符串连接速度更快的技术说明:连接两个字符串 S1 和 S2 的 C++ 函数执行以下操作:分配一个足够大的缓冲区以容纳结果,然后将 S1 和 S2 的字符复制到缓冲区中。要连接两个以上的字符串,如 JS s + "foo" + t,Fx3.5 只需从左到右一次连接两个字符串。

使用 Fx3.5 算法,要连接每个长度为 K 的 N 个字符串,我们需要执行 N-1 次内存分配,并且除了一个之外的所有分配都是针对临时字符串的。更糟糕的是,前两个输入字符串被复制了 N-1 次,下一个被复制了 N-2 次,依此类推。复制的字符总数为 K(N-1)(N+2)/2,即 O(N^2)。

显然,我们可以做得更好。我们可以执行的最小工作是将每个输入字符串恰好复制一次到输出字符串,总共复制 KN 个字符。Fx3.6 通过检测 JS 程序中的连接序列并将整个序列组合成一个使用最佳算法的操作来实现此目的。

以下是一些您可以在 Fx3.6 中尝试的运行速度更快的字符串基准测试

演示:Fx3.6 字符串操作


/w+/:

indexOf('foo'):

match('foo'):

构建 HTML:

最终想法和后续步骤

我们还进行了一些不属于上述大类的小改进。最重要的是,Adobe、Mozilla、Intel、Sun 和其他贡献者继续改进 nanojit,即 TraceMonkey 使用的编译器后端。我们改进了它对内存的使用,使跟踪记录和编译速度更快,还提高了生成的原生代码的速度。更好的 nanojit 会为在 JIT 中运行的所有 JS 提供提升。

有两件大事没有进入 Fx3.6,但将在 Firefox 的下一个版本中出现,并且已在 nightly 构建中提供

  • JIT 递归。递归代码(如显式循环代码)可能是热点代码,因此应进行 JIT 处理。Nightly 构建直接 JIT 递归函数。相互递归 (g 调用 f 调用 g) 尚未被跟踪。
  • AMD x64 nanojit 后端。Nanojit 现在有一个生成 AMD x64 代码的后端,这使得该平台有可能获得更好的性能。

如果您尝试 nightly 构建,您会发现许多这些演示的运行速度甚至比 Fx3.6 中的还要快!

关于 Alix Franquet

Alix Franquet 的更多文章…


85 条评论

  1. fabrice

    精彩的文章!

    是否有任何工具可以检查扩展程序的代码是否正在被跟踪?

    2010年1月13日 10:37

    1. Dave Mandelin

      我们确实有一个用于此的工具 TraceVis,我之前在我的个人博客上写过关于它的文章,但它在标准浏览器构建中未启用。我们希望启用它,可能是在具有扩展程序的特殊构建中,但我们还没有时间这样做。如果您勇敢,可以修补源代码,然后构建一个包含 TraceVis 的浏览器。如果您想尝试,请给我发送电子邮件寻求帮助。

      2010年1月13日 18:17

  2. 尝试不错

    尝试不错,但 Chrome 和 V8 仍然大幅优于 Tracemonkey。此外,我仍然看到垃圾回收导致动画暂停,而在 Chrome 中则完全流畅。

    2010年1月13日 10:47

  3. sep332

    x64 JIT?此功能在 Windows nightly 版本中可用,还是我必须手动为 64 位 Windows 构建?

    2010年1月13日 10:51

  4. Zorkzero

    刚刚在 http://stackulator.com/rtree/ 上尝试了基准测试。Firefox 3.6rc1 在“删除 1k 个元素…”时出现故障,并显示以下消息
    错误:b 未定义
    来源:http://stackulator.com/rtree/rtree.js
    行:689

    Firefox 3.5.7 可以顺利完成所有测试。这是在 Windows XP SP3 上。

    2010年1月13日 11:17

    1. Dave Mandelin

      您在哪个页面上遇到此错误?我点击了“基准测试”,链接到 http://stackulator.com/rtree/numbers.html。它在我使用 Vista 和 3.6rc1 的机器上完成了运行,没有出现 JS 错误。

      2010年1月13日 18:22

      1. Zorkzero

        我在 http://stackulator.com/rtree/numbers.html 上遇到了此错误。我甚至创建了一个新的干净配置文件,但仍然出现相同的错误。

        当我以“-safe-mode”启动时,基准测试可以顺利完成。因此,它一定是以下扩展程序之一:“Java 控制台 6.0.18”、“Java 快速启动 1.0”、“Microsoft .NET Framework 助手”。即使我禁用了所有这些扩展程序,错误仍然存在。我无法卸载任何一个,因为“卸载”按钮呈灰色不可用。

        2010年1月14日 07:45

        1. Jamie Penney

          我可以确认在32位Windows 7上使用Firefox 3.6时,我遇到了同样的错误,导致测试失败。

          2010年1月24日 14:16

        2. Max

          在3.6版本中,该测试对我来说永远无法完成。它只是显示“正在删除1k个项目”。在Chrome中,它可以运行到结束。

          2010年1月24日 15:14

  5. Ted Mielczarek

    sep332: 我们目前没有64位Windows nightly版本。我们的Windows nightly版本都是32位的,并使用x86 JIT后端。

    2010年1月13日 11:42

  6. Boris

    sep332,你需要使用64位版本才能使用它。我认为我们目前还没有64位Windows nightly版本。

    2010年1月13日 12:57

  7. TNO

    关于正则表达式,“s”,“S”,“.”,“^”和“$”这些标记都支持Unicode。是否有优化可以识别字符串是否实际上包含任何非ASCII字符?如果没有,这种能力是否可能允许使用更少的字符比较?

    2010年1月13日 13:58

  8. Alex Vincent

    我建议你看看你在planet.mozilla.org上的帖子——那里的文本与其他几个帖子重叠了……

    2010年1月13日 15:14

    1. Alix Franquet

      Alex:感谢你告知!我们正在调查此事。

      2010年1月13日 16:13

  9. Drazick

    FF什么时候才能达到Safari、Chrome,甚至最近的Opera一样的性能?

    谢谢。

    2010年1月13日 17:16

  10. David

    我在Ubuntu上使用FF3.5 64位时,得到Est GC延迟:2255ms。我不确定减速是由于XULRunner在Linux上的糟糕性能,还是仅仅因为它使用了旧的JS引擎。FF 3.6 64位版本是否会有Tracemonkey?

    另外,你需要修复此表单上的电子邮件验证。它不适用于像yourname+mozilla@example.com这样的有效电子邮件地址。

    2010年1月13日 17:59

  11. 问题

    nightly 20091213 vs chrome3
    gc延迟:100ms vs 6ms

    2010年1月13日 22:31

  12. Transcontinental

    坦率地说——我已经将页面布局速度(包括大量脚本的页面)与FF 3.6 RC和Google Chrome上的JIT(chrome和内容)进行了比较,我确实没有察觉到任何区别。在Firefox 3.5.7中(JIT内容和chrome都没有问题),我确实注意到了,但Firefox 3.6 RC确实非常快,而且流畅。我承认计算到毫秒可能会反映出未察觉到的差异,但就我而言,这些差异并不明显。最后一点:在Google Chrome最新的beta版本中,布局速度似乎有点随机,而TraceMonkey的性能则更加稳定。

    2010年1月14日 00:47

  13. Gerv

    你是否在所有平台上都进行了这些GC计时测量?在我的
    Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100105 Firefox/3.6
    (Ubuntu 9.10上的3.6最新版本,在一台IBM Thinkpad X200上),上面演示的平均GC延迟在重启后为75ms。并且当发生GC时,动画明显卡顿。

    但是,当我第一次访问此页面并尝试该演示时,在大概一分钟的时间里,时间一直保持在600ms!我想知道为什么我的Firefox会频繁出现短暂的卡顿。我确实打开了一些其他标签页,尽管没有什么看起来特别活跃的。这种性能下降对我来说很常见;我必须经常重启Firefox。我该如何追踪导致这种情况的原因?

    2010年1月14日 04:10

  14. Neil Rashbrook

    代码块始终显示在Planet上的联合版本中,但高度限制仍然有效,这会导致代码溢出到后续帖子中……

    2010年1月14日 04:19

  15. Ciprian Mustiata

    您好。在3.6版本中,暂停非常明显,但我可能遗漏了一些东西(我有一个2 GHz+的CPU,在我的机器上暂停时间为75毫秒)。我找到了两种处理短暂暂停的方法,它们都与“收集小堆”这句话有关
    ——使用分代GC(我知道这很难实现,但解决方案将使调整最新一代的大小成为可能,从而使暂停时间稳定在约10毫秒左右),而不是收集所有堆。对于最终会发生的重大收集,可以通过使用具有可预测大小的分代(查找在旧版Java实现中使用的火车收集算法)来实现,或者你可以使用一种前沿算法(如G1),它将始终在指定时间内收集较大的块。第二种方法可能有利于获得可预测的暂停。
    ——每个组件使用单独的堆:标签页、chrome框架。这将使查找死亡对象的搜索空间更小。每个组件使用单独的堆将使在开销标记中更容易删除/添加新的堆。无论如何,JS可以访问单独的堆,并且应该涉及一些编组。
    我知道这两件事说起来容易做起来难,但与此同时,我必须说明这些问题,也许有人会找到一个对用户体验影响最小的合适解决方案。
    我认为TraceMonkey JIT今天确实很有能力,即使它没有与其他实现并驾齐驱(慢2倍)。但我认为许多基准测试实际上并没有说明慢2倍实际上比两年前快了20倍。
    干得好,伙计们!

    2010年1月14日 04:32

  16. Fab

    IE7:DOM属性设置:88935毫秒
    FF3.6:DOM属性设置:55毫秒

    在其他浏览器性能如此糟糕的情况下,我们无法做任何漂亮的事情。

    2010年1月14日 07:01

  17. Boris

    实际上,“DOM属性设置”测试实际上并没有测试DOM属性,因为HTMLSpanElement上没有“x”DOM属性。它只是在测试扩展(仍然有用,但不是jorendorff的补丁旨在修复的内容)。

    2010年1月14日 09:07

  18. Boris

    Zorkzero,安全模式会禁用jit,所以bug消失了。

    就我而言,我可以重现该bug并为此提交了https://bugzilla.mozilla.org/show_bug.cgi?id=539553。它现在阻止了3.6版本的发布。

    2010年1月14日 09:11

  19. Kelly Clowers

    刚刚使用SeaMonkey 2.0.3pre(Gecko 1.9.1.8pre)和FF3.7 20100112(两者都在Linux上使用64位)尝试了这里的测试。
    速度提升非常明显。不过,动画仍然有一些卡顿,延迟约为80毫秒。

    @fab IE 8好多了(而且IE 6和7的份额正在下降,转而支持8),IE 9版本又好多了,与其他浏览器处于同一水平。

    2010年1月14日 20:02

  20. Mark

    我刚刚在3.6版本中尝试了gc卡顿测试,当发生gc时仍然很容易注意到(跳过1/4圆圈,gc延迟70-95毫秒),当打开许多标签页(30个)时。
    这是在Linux上。

    2010年1月16日 07:59

  21. Ricardo

    在3.6/Win XP上,GC得到85ms,明显的延迟和卡顿。没什么新鲜事。

    2010年1月16日 12:23

  22. nemo

    Ricardo,你使用Firebug了吗?
    在尝试此页面之前,可能需要禁用该插件。

    2010年1月19日 11:39

  23. Hanster

    哇……

    2010年1月19日 19:39

  24. mawrya

    此帖顶部应该有一个警告——Firebug会干扰JIT,特别是1.5之前的版本

    考虑到开发者最有可能阅读此帖,并且最有可能安装Firebug,他们最终可能会在Firefox和其他浏览器之间进行不稳定的比较,或者得出其他结论,因为他们不知道Firebug已经完全禁用了JIT。

    2010年1月19日 21:56

  25. […] 不是一个普通的维护版本,而是据说比其前身快得多。在这个页面上,你可以阅读一篇长文章(但也非常技术性),展示了在 […] 中取得的进步。

    2010年1月20日 23:24

  26. […] 速度改进——TraceMonkey,快速的JS引擎进行了一些调整以进一步提高性能。现在在<video/>中的搜索比在 […] 中快得多。

    2010年1月21日 12:13

  27. […] 浏览器打开选项卡和缩短启动时间的整体响应。与Firefox […] 相比,Firefox 3.6的性能提高了20%。

    2010年1月21日 12:49

  28. […] 用于Personas,可以在不重新启动浏览器的情况下安装的轻量级主题,并为新的Tracemonkey Javascript引擎添加了进一步的性能改进。该版本的主要目标之一是提高启动时间和整体UI响应速度,[…]

    2010年1月21日 13:22

  29. […] 在TraceMonkey中运行速度提高了3-4倍,相比Firefox 3,”Mozilla JavaScript团队的软件工程师David Mandelin写道。“对于 […]

    2010年1月21日 14:01

  30. Sun

    我几乎完成了迁移到Chrome的过程。只需要书签同步(Chrome在beta版中提供了),但我希望使用Xmarks。我们认为Firefox在几年里非常棒,但Chrome一直在击败你们。我希望你们能够提高速度,以便我们继续使用你们的产品。

    2010年1月21日 14:25

  31. […] 用于Personas,可以在不重新启动浏览器的情况下安装的轻量级主题,并为新的Tracemonkey Javascript引擎添加了进一步的性能改进。该版本的主要目标之一是提高启动时间和整体UI响应速度,[…]

    2010年1月21日 14:49

  32. […] Javascript性能:提高了Javascript的性能。点击此处查看详细信息。[…]

    2010年1月21日 15:11

  33. […] 防止与第三方软件崩溃的工作。还有一些增强功能,例如改进的JavaScript性能和优化,以加快日常Web任务的速度,使Web应用程序更流畅。然而,什么 […]

    2010年1月21日 16:01

  34. […] 比Firefox 3.5快20%,包括新的JavaScript代码跟踪(在英文Hacks页面上有一篇非常技术性的文章)。除了这项改进之外,浏览器的响应速度也更加流畅,并且启动时间 […]

    2010年1月21日 18:20

  35. Wiritpol

    Firefox 3.6不支持这些ICC配置文件版本4

    2010年1月21日 20:07

  36. mynthon

    fx3.5中的gc延迟:~100ms
    fx3.6中的gc延迟:~140ms

    我没有看到改进。

    2010年1月22日 11:59

  37. […] Lockdown,它在没有明确用户许可的情况下锁定Firefox插件。此外,他们对TraceMonkey JavaScript引擎进行了一些改进,以提高/加快视频性能,以及许多其他 […]

    2010年1月22日 16:19

  38. Marko Macek

    我使用3.6最终版本再次尝试了一下,延迟现在是40-45毫秒(仍然打开了30多个标签页)。

    2010年1月23日 05:08

  39. Mark Holton

    请继续推进(并分享这些见解)。
    衷心感谢——

    2010年1月24日 01:23

  40. […] Mozilla JavaScript团队的David Mandelin在hacks.mozilla.org博客上发布了有关Firefox 3.6 JavaScript改进的技术细节。[…]

    2010年1月24日 02:01

  41. […] 根据Computerworld运行的测试,新版本的Firefox 3.6比Firefox 3.5快约15%。现在,Firefox渲染JavaScript的速度是Opera 10的三倍,大约是IE8的四倍。这些数据将Firefox列为网络上第三快的浏览器——仅次于Safari和Chrome。如果你想了解更多关于Firefox上Java速度提升的信息,这里有很多资料。[…]

    2010年1月24日 03:08

  42. […] Hacker News上的完整帖子如果你喜欢这篇文章,请考虑分享!标签:Firefox […]

    2010年1月24日 06:47

  43. gwenhwyfaer

    没有3.5版本可以测试。但在FF 3.6、WinXP sp2、Duron 1600、512MB RAM和共享显卡下,我的GC暂停时间为280-320毫秒。

    (任何告诉我升级机器的人都可以给我一些钱来升级。)

    2010年1月24日 06:51

    1. gwenhwyfaer

      (请重新指定上述评论的父级。)

      2010年1月24日 06:52

  44. Jimboooo!

    帧延迟:28
    GC延迟:416
    卡得要命(无法分辨线条旋转的方向)

    这是在Linux上,没有其他应用程序/标签页打开。为什么Firefox在Linux上的性能如此糟糕?Chrome完美流畅地渲染了线条。

    2010年1月24日 08:24

    1. David

      Thunderbird在Linux上也很迟钝,所以这可能是因为XULRunner的性能很差。

      2010年1月25日 17:38

  45. […] Mozilla JavaScript团队的David Mandelin在hacks.mozilla.org博客上发布了有关Firefox 3.6 JavaScript改进的技术细节。[…]

    2010年1月24日 08:50

  46. […] Mozilla JavaScript团队的David Mandelin在hacks.mozilla.org博客上发布了有关Firefox 3.6 JavaScript改进的技术细节。[…]

    2010年1月24日 12:20

  47. […] Chrome。对于那些没有感受到爱的人,以下是FF 3.6加速的详细信息:Firefox 3.6中的JavaScript加速✩ Mozilla Hacks——Web开发人员博客确保about:config中的以下选项为真(尽管它们默认为真)[…]

    2010年1月24日 15:34

  48. Mic

    在开发Web应用程序时,我大部分时间都在FF窗口中。
    我有点犹豫是否要迁移到3.6,因为过去一些版本破坏了我的开发环境。

    我首先迁移到Firebug 1.5,它立即变得更好。
    但安装3.6彻底改善了响应时间。现在每个操作都显得即时。

    非常感谢你们的辛勤工作,从今天开始,你们让我的工作效率大大提高了。

    2010年1月24日 16:30

  49. […] Mozilla JavaScript团队的一名成员David Mandelin在hacks.mozilla.org博客上发布了有关Firefox 3.6 JavaScript开发的技术细节。[…]

    2010年1月25日 07:16

  50. […] Mozilla JavaScript团队的David Mandelin在hacks.mozilla.org博客上发布了有关Firefox 3.6 JavaScript改进的技术细节。[…]

    2010年1月25日 上午07:57

  51. onur

    Firefox 3.6不支持这些ICC配置文件版本4

    2010年1月25日 中午12:00

  52. Dimitrs

    我想谦卑地建议一个选项,即直接对*所有*代码进行JIT编译,而不是花费周期分析代码路径?我认为Chrome就是这么做的。

    2010年1月26日 上午06:50

  53. [...] 3.6版本于上周发布,代表着许多人付出了大量的工作。JavaScript性能比已经很快的3.5版本更快,并且UI的许多其他方面也进行了改进[...]

    2010年1月26日 上午07:01

  54. tsphand1

    我需要更快的速度

    Mozilla可以构建x64版本…………
    什么时候完成?

    2010年1月28日 上午01:49

  55. Chris

    Firefox 3.6 清理启动
    帧延迟:16
    GC延迟:74

    Chrome 4 清理启动
    帧延迟:9
    GC延迟:16

    我认为Mozilla在这方面还有很长的路要走。

    2010年1月28日 下午14:54

  56. Vijay Rayapati

    太棒了,我们什么时候会在FF中拥有像Google Gears中类似的线程化JS执行功能。

    2010年1月29日 上午04:10

    1. Sasha Chedygov

      它已经存在了。查看Web Workers API

      2010年1月30日 下午14:13

  57. F

    帧延迟:13
    GC延迟:143

    唉,我看不出有什么区别

    2010年1月30日 上午08:31

  58. default

    我认为Firefox 3.6中仍然没有提供x86_64 nanojit非常令人遗憾。我定期测试trunk版本,并且它已经为我正常工作了*几个月*了。

    请记住,在Unix上,即Linux/FreeBSD上,原生64位Firefox是x86_64系统上的默认版本!

    2010年1月31日 下午12:04

  59. Pascal

    嗯,很有趣:只是为了好玩,对fx3.6和Chrome进行了一些比较,即使我在fx中打开了大约100个标签页,它在字符串部分仍然更快(大约快3倍!)

    2010年2月2日 上午08:46

  60. bleh

    与3.5相比,3.6看起来非常快速流畅。我还安装了Chrome 4 Beta,它不像我记忆中那么快。在我看来它们似乎一样快,但Chrome没有NoScript。带有扩展程序的Chrome确实减慢了速度。继续改进FF,它正在取得进展。

    2010年2月2日 下午20:35

    1. Ziru

      Chrome的一个优点是,很容易找出哪个扩展程序导致浏览器变慢。因此,用户可以轻松禁用有问题的扩展程序。对于FF,Mozilla论坛中最常见的建议是切换到安全模式,禁用所有扩展程序,然后逐个启用它们。

      2010年3月1日 上午11:36

      1. raj

        我尝试过Chrome和Firefox。Firefox有更多插件选择。这些插件使Firefox更易用和可靠。

        2011年3月15日 上午05:55

  61. nick

    最后一个框中的那些字符串操作在Firefox中比在Chrome中运行得快得多,并且我使用了两个浏览器的最新版本。但是,前两个测试在Chrome中更快。

    我得到的GC延迟估计为91毫秒!Chrome似乎消耗了更多系统资源才能在同一测试中获得10毫秒的分数。不过我的电脑比较旧,所以也许我赢不了。

    2010年5月8日 下午13:34

  62. Gary

    好吧,我觉得我快受不了Firefox了……除非有人能提供帮助。

    根据我的经验,Firefox 3.x中的GC犹豫现象变得更加普遍。在观看视频时尤其明显。是的,即使视频已缓存,每15-20秒也会出现短暂的暂停,因此这与流媒体无关。清除缓存似乎无济于事。重新启动可以减少影响,但在加载了一些网页并运行了一些视频后,犹豫现象会变得非常明显。

    我在Firefox中运行了GC暂停动画,平均GC延迟为59毫秒,帧延迟为17毫秒。秒针在每次旋转时都会重复暂停一两次。

    我在Google Chrome中运行了GC暂停动画,平均GC延迟为12毫秒,帧延迟为7毫秒。秒针运行流畅,没有任何暂停。

    我花了几个小时在互联网上搜索,试图找到有关我遇到的这些暂停的信息,直到最后找到此页面。结果告诉我,我最好使用Google Chrome……除非有一些特殊的更新可以应用于修复Firefox中的GC性能?

    2010年5月27日 上午10:27

    1. Gary

      注意:我在Firefox中声明的GC延迟被低估了。重新运行动画显示结果大幅波动,远高于我最初发现的结果。根据我最后一次运行的结果,它最初在50多毫秒,然后随着秒针的每次循环而持续上升,达到100毫秒以上,然后稳定在90多毫秒。考虑到我体验到的行为,我并不感到意外……

      2010年5月27日 上午10:38

    2. Christopher Blizzard

      Gary –

      Firefox确实有一个浏览器范围的GC,它会导致整个浏览器暂停,并且最终会经常运行,尤其是在您打开很多标签页时。

      对于Firefox 4,我们计划实现每页GC,这将使我们获得Chrome所采用的每个进程模型的大部分好处。

      请注意,这些测试旨在触发Firefox中的GC。Chrome在运行这些测试时可能根本不会运行GC。(事实上,帖子中有一个醒目的警告说:“此过程可能不适用于其他浏览器,因此不适用于比较不同的浏览器。”)因此请记住这一点。

      因此,同意GC暂停很糟糕,我们将为Firefox 4提供一些功能,并且当我们转向多进程模型时,我们将处于更好的状态。

      2010年5月27日 上午10:42

  63. Gary

    感谢您快速回复,Christopher(没想到这么快,所以我没有立即回复)。:-)

    我的错……我甚至没有意识到Chrome基于WebKit布局引擎和应用程序框架,因此它与Mozilla没有任何共同之处。

    我确实进行了自己的测试,在重新启动以清除任何已用内存后,在Chrome和Firefox中执行相同的浏览活动。过了一会儿,我开始注意到Chrome中视频响应更好。Firefox在播放过程中会开始出现这种周期性的犹豫/暂停。

    我在早期版本的Firefox中没有遇到此问题。我不记得它是什么时候开始出现的。无论如何,是操作模型中的更改导致了它吗?还是它一直存在,只是其他一些更改帮助揭示了它?

    Chrome具有一些吸引人的特性,例如顶部的小占用空间,允许在每个标签页中获得更大的观看区域。它简化了一些选项控制菜单(尽管以牺牲一些灵活性为代价)。但我喜欢Firefox提供的广泛配置控制。我期待在版本4中重新使用它。;-)

    2010年6月2日 上午07:00

  64. Sadiq nasiry

    好吧,我认为这只是一个新名称,而不是一个新的区别,因为所有
    速度、插件和其他方面都相同,尽管宣传重点是标签页(从fx3.0升级),但对于拨号连接来说,没有任何区别!!!

    2010年7月1日 上午00:07

  65. massschneider

    达到100毫秒以上,然后稳定在90多毫秒。我并不感到意外

    2010年7月29日 上午08:15

  66. Jeffz

    各位,
    最新的FF – 即使所有附加组件都已启用,仍然“卡顿得厉害”。
    它的JS动画比我测试过的所有其他浏览器都要糟糕。
    即使IE7也明显更好。

    FF应该对复杂的JS动画做些什么。
    而且要快。

    2010年8月28日 下午14:20

    1. Jeffz

      我的意思是“所有附加组件都关闭”

      2010年8月28日 下午14:22

  67. max jones

    JavaScript的处理方式与早期版本有所不同。试图找出是什么导致我来到这里。

    现在Firefox几乎无法使用。每隔几分钟,我就会收到一条关于“JavaScript无响应,您是否要继续”的消息。无论发生了什么都会导致我的笔记本电脑停止工作。如果我等待5到10分钟,它会释放足够的周期来继续。大多数情况下,我只需将其关闭并重新启动。我必须等到“您是否要继续”消息弹出……通常还有几个JavaScript变得无响应,阻止我停止对话框中第一个点击停止……

    大多数问题都与Gmail有关。起初我以为谷歌可能会效仿微软,让Chrome占据优势。但在观察并确定哪些脚本崩溃后,我得出结论,这或多或少是随机的。所有脚本都受到影响。

    运行Ubuntu 10.10.1。我尝试过夜间版本,但它似乎没有消失……

    2010年10月29日 上午06:32

  68. psalmsninetyone

    我正在使用Firefox 3.6.12,并且在第一次运行时遇到了这种情况

    帧延迟:18
    GC延迟:14

    然后在第二次运行时得到以下结果

    帧延迟:16
    GC延迟:27

    随着标签页数量的增加,GC延迟数字自然会上升,但帧延迟相当稳定

    2010年11月1日 下午22:49

  69. jhon

    我正在使用Firefox 3.6.15和Greasefire……它很棒

    2011年3月17日 下午13:47

  70. BMorris

    JIT是浏览器历史上开发的最重要的技术之一。也许对于所有浏览器来说,采用和实现JIT并为其制定一个通用标准,并进一步优化它会很好。

    2011年3月23日 上午03:58

  71. Chris

    不错的测试应用程序。

    我的拨号每转2-3圈就会卡顿,并且GC延迟徘徊在80毫秒左右,这是使用FF 3.6的结果。我只有12个附加组件,我估计唯一的大组件是Adblock Plus,我认为它是必不可少的,还有Tab Mix Plus,我也很难离开它。其余的都是像Perspectives这样的小组件。

    2011年3月30日 下午17:22

本文的评论已关闭。