31

我试图了解 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 下最慢(有或没有“use asm”注解),而 chrome 在 asm-mode 下最快。

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

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

4

1 回答 1

8

当您在 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 与 13K
  • IE11:所有测试约为 7.5K,没有观察到大的差异,除了死代码消除,它闪耀;)
于 2013-09-03T23:57:18.627 回答