Я пытаюсь понять, как работает 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-синтаксиса (с аннотацией "asm" или без него), а хром быстрее в asm-режиме.
Итак, мой вопрос: как это возможно? Я ожидаю, что Firefox будет самым быстрым в режиме asm. Я бы не ожидал увидеть разницу для Chrome. Я использую неправильный синтаксис asm? Что мне не хватает?
Приветствуются любые советы или разъяснения. Спасибо,