使用asm.js配置文件似乎没有更快的Firefox,但Chrome是

时间:2013-07-30 15:38:31

标签: javascript performance google-chrome firefox asm.js

我正在努力了解ASM的确切运作方式以及何时启动。

我从asm.js网站上获取了一个小函数。我使用模块模式包装它:一次用于asm,一次使用相同的语法,但没有“use asm”注释,一次像vanilla-javascript。

 var add_asm = (function MyAOTMod(stdlib, foreign, heap) {
  "use asm";
  var sqrt = stdlib.Math.sqrt;

  function square(x) {
    x = +x;
    return +(x * x);
  }
  return function(x, y) {
    x = +x; // x has type double
    y = +y; // y has type double
    return +sqrt(square(x) + square(y));
  };
}(window));

var add_reg_asmstyle = (function MyAsmLikeRegularMod() {

  function square(x) {
    x = +x;
    return +(x * x);
  }
  return function(x, y) {
    x = +x; // x has type double
    y = +y; // y has type double
    return +Math.sqrt(square(x) + square(y));
  };
}());


var add_reg = (function MyStrictProfile() {
  "use strict";
  return function(x, y) {
    return Math.sqrt(x * x + y * y);
  };
}())

我创建了一个小jsperf: jsperf代码与上述内容略有不同,其中包含以下讨论主题中的提示 http://jsperf.com/asm-simple/7

性能表明firefox 22使用asm-syntax(使用或不使用“asm”注释)速度最慢,而且在asm-mode中chrome最快。

所以我的问题是:这怎么可能?我希望Firefox在asm模式下最快。我不希望看到Chrome的差异。我使用错误的asm语法吗?我错过了什么?

非常感谢任何建议或澄清。谢谢,

1 个答案:

答案 0 :(得分:7)

当您在Firefox中运行代码时,您经常会看到asm.js调用的速度大幅下降,这很可能是由重复编译(在控制台中可见)或js-to-asm调用的成本引起的。这个假设由asm.js的实现者Luke Wagner进一步加强:

  

我们已经知道的一个性能故障会让人感到高兴   尝试对asm.js进行基准测试就是从非asm.js调用   asm.js反之亦然比正常通话慢得多   通用进入/退出例程。我们计划在下一步解决这个问题   几个月,但在此期间,为了进行基准测试,请尝试   保持整个计算发生在单个asm.js模块中,   不打电话进去。

要亲眼看看 - 请看小提琴:http://jsperf.com/asm-simple/10

  • Firefox 26:asm-asm案例 22,600K ops / sec与asm-js案例中 300 (!)。
  • Chrome 28:18K vs 13K
  • IE11:〜7.5K用于所有测试,没有观察到大的差异,除了死代码消除,它发光;)