上周发布的最新版 Firefox 包含用户界面和同步功能等方面的重大更新。此版本在 asm.js 性能方面也带来了显著的改进,正如我们将在下面看到的那样,这对游戏等方面非常重要。为了将 Firefox 性能的这一方面置于背景中,我们将看一下 Firefox 与其他浏览器的基准测试结果,结果显示 Firefox 在执行 asm.js 代码方面更快。
asm.js 加速
asm.js 是 JavaScript 的一个子集,非常容易优化,特别适用于将 C 或 C++ 代码移植到 Web。我们已经发布了博客文章,介绍了 Firefox 如何使用 32 位浮点运算优化 asm.js 代码,这些优化与其他所有优化 asm.js 的工作一起,使其运行速度约为将相同的 C/C++ 代码本地编译后运行速度的 1.5 倍慢。因此,虽然还没有达到本地速度,但已经非常接近了。在发布该博客文章时,这些优化只在 nightly 版本中可用,但现在它们已经到达了 Firefox 29 的数亿 Firefox 用户手中,而 Firefox 29 现在是 Firefox 的正式版本。
另一组重要的 asm.js 优化涉及 启动速度。正如 Luke 在几个月前发布的博客文章中所述,Firefox 执行预先编译 (AOT),并且可以缓存结果,从而显著提高启动速度。这些优化也已随 Firefox 29 发布到了用户手中。
Web 浏览器比较
现在所有这些优化都已经发布了,看看 asm.js 代码的最新浏览器比较很有意思。上图显示了 Emscripten 基准测试套件 在 Windows 8.1 上运行 Google Chrome、Internet Explorer 和 Firefox 的最新稳定版本的结果。在这里,所有结果中较小的数字都更好,这些结果是编译为 asm.js 的实际代码库(参见图表中的注释)。
Unity、Emscripten 和 asm.js
asm.js 是 JavaScript 的一个子集,因此它只是众多 JavaScript 风格中的一种。但它代表了一个重要的用例。正如我们在 GDC 上宣布的那样,我们宣布,Unity(市场上最流行的游戏创作工具之一)将通过使用 Emscripten 将其引擎编译为 asm.js 来支持 Web。
但是,视频不能替代实际情况!您可以现在在您的浏览器中尝试那里显示的游戏,包括 Unity 最近发布的Dead Trigger 2 和Angry Bots 演示。如果您在最新版本的 Firefox 中运行这些游戏,您将看到之前提到的许多 asm.js 优化在起作用。例如,如果您多次访问其中一个链接,那么 asm.js 缓存将允许它避免重新编译游戏(因此它启动得更快),而且游戏玩法也将由于更快的 asm.js 执行而更加流畅。
能够有效地执行 asm.js 风格的代码使得像这样的游戏能够在 Web 上良好运行,而无需专有的、非标准插件。这就是为什么看到更多 asm.js 优化在 Firefox 29 中到达 Firefox 用户手中令人兴奋的原因。虽然基准测试结果有时看起来只不过是抽象的数字,但 asm.js 基准测试的加速直接改善了游戏等方面,在这些方面,性能至关重要,而且非常明显。
(感谢 Marc Schifer 帮助进行基准测试测量。)
关于 Robert Nyman [名誉编辑]
Mozilla Hacks 的技术布道者和编辑。发表关于 HTML5、JavaScript 和开放 Web 的演讲和博客文章。Robert 是 HTML5 和开放 Web 的坚定支持者,自 1999 年以来一直在从事 Web 前端开发工作,足迹遍布瑞典和纽约市。他还定期在 http://robertnyman.com 上发布博客文章,喜欢旅行和结识新朋友。
15 条评论