J'essaie de comprendre comment fonctionne exactement l'ASM et quand il intervient.
J'ai pris une petite fonction du site asm.js. Je l'ai enveloppée en utilisant le modèle de module : une fois pour asm, une fois avec la même syntaxe mais sans l'annotation "use asm", et une fois comme 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);
};
}())
J'ai créé un petit jsperf : le code jsperf est légèrement différent du précédent, incorporant des astuces du fil de discussion ci-dessous http://jsperf.com/asm-simple/7
Les performances montrent que firefox 22 est le plus lent avec la syntaxe asm (avec ou sans l'annotation "use asm"), et que chrome est le plus rapide en mode asm.
Ma question est donc la suivante : comment cela est-il possible ? Je m'attendrais à ce que Firefox soit le plus rapide en mode asm. Je ne m'attendrais pas à voir une différence pour Chrome. Est-ce que j'utilise une mauvaise syntaxe asm ? Qu'est-ce qui me manque ?
Tout conseil ou éclaircissement est le bienvenu. Merci,