Javascript Firefox在使用asm.js配置文件时似乎并没有更快,但Chrome却更快

Javascript 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 = +

我试图了解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代码与上述代码稍有不同,包含了下面讨论线程中的提示

性能表明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对于所有测试,没有观察到大的差异,除了死掉的代码省略,它在哪里发光;)
@Ian:OP正在比较每个浏览器中的ASM和非ASM代码,以了解它们之间的区别。Chrome不支持AFAIK的ASM优化,所以注释应该不会有什么不同,而FireFox支持它。OP没有将FF与Chrome进行比较。@Thomas:我很想知道为什么每个函数都有一些小的变化。第一个缓存
Math.sqrt
,第二个不缓存,第三个不使用舍入函数,也不使用一元
+
运算符。我不知道这会有什么不同,但我认为你应该保持一致。你不应该手工编写ASM.js代码,因为你几乎肯定无法(注意:在不符合ASM.js的代码中使用“use ASM”,会自动退回到常规的js执行)。它应该是编译器生成的代码的目标,比如@CAFxX。如果它只是javascript,您应该能够手工编写它。就像您(和人们)可以直接编写x86汇编一样。浏览器的实现细节可能会产生非直观的效果//不知道警告
TypeError:asm.js type错误:比较的参数必须是有符号、无符号或双精度的;int和int为正品或缺陷。观察到的速度提升让我相信这只是一条垃圾消息。在Javascript中,由于邪恶的
eval
函数及其同样邪恶的计数器部分:
Proxy
,几乎不可能(如果有的话)“消除死代码”。