Javascript Firefox在使用asm.js配置文件时似乎并没有更快,但Chrome却更快
我试图了解ASM是如何工作的,以及何时开始工作的 我从asm.js网站上获取了一个小功能。我使用模块模式包装它:一次用于asm,一次使用相同的语法但没有“use asm”注释,还有一次类似于vanilla javascriptJavascript Firefox在使用asm.js配置文件时似乎并没有更快,但Chrome却更快,javascript,performance,google-chrome,firefox,asm.js,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 = +
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代码与上述代码稍有不同,包含了下面讨论线程中的提示
性能表明firefox 22在asm语法(有或没有“使用asm”注释)下运行最慢,而chrome在asm模式下运行最快
所以我的问题是:这怎么可能?我希望Firefox在asm模式下速度最快。我不希望看到Chrome有什么不同。我是否使用了错误的asm语法?我错过了什么
非常感谢您的任何建议或澄清。谢谢,当您在Firefox中运行代码时,您经常会看到asm.js调用的速度大幅下降,这很可能是由于重复编译(在控制台中可见)或js到asm调用的成本造成的。asm.js的实现者进一步强化了这一假设: 我们已经知道的一个性能故障会让人绊倒 尝试对asm.js进行基准测试就是从非asm.js调用 asm.js和asm.js都比正常调用慢得多,因为 通用进入/退出例程。我们计划在下个月解决这个问题 几个月,但同时,出于基准测试的目的,尝试 让整个计算在单个asm.js模块中进行, 不打电话进进出出 亲自去看看——看看小提琴:
- Firefox 26:22600kasm案例中的每秒操作数,与asm js案例中的300(!)相比
- 铬28:18K vs 13K
- IE11:~7.5K对于所有测试,没有观察到大的差异,除了死掉的代码省略,它在哪里发光;)李>
Math.sqrt
,第二个不缓存,第三个不使用舍入函数,也不使用一元+
运算符。我不知道这会有什么不同,但我认为你应该保持一致。你不应该手工编写ASM.js代码,因为你几乎肯定无法(注意:在不符合ASM.js的代码中使用“use ASM”,会自动退回到常规的js执行)。它应该是编译器生成的代码的目标,比如@CAFxX。如果它只是javascript,您应该能够手工编写它。就像您(和人们)可以直接编写x86汇编一样。浏览器的实现细节可能会产生非直观的效果//不知道警告TypeError:asm.js type错误:比较的参数必须是有符号、无符号或双精度的;int和int为正品或缺陷。观察到的速度提升让我相信这只是一条垃圾消息。在Javascript中,由于邪恶的eval
函数及其同样邪恶的计数器部分:Proxy
,几乎不可能(如果有的话)“消除死代码”。