我正在努力了解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语法吗?我错过了什么?
非常感谢任何建议或澄清。谢谢,
答案 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