Немного поковырял этот asm.js. В результате написал пару тестовых ф-ий, плюс аналогичные на простом javascript для сравнения производительности (отличаются только строкой "use asm"; для чистоты эксперимента):
function asm(stdlib, foreign, buffer){
"use asm";
function hello(name, cycle=false){
var name2 = "";
if( cycle ) {
for(var i=0; 50000000>i; i++ ){
name2 = "Привет, " + name + ". Съешь ещё этих мягких французских булочек да выпей чаю!";
}
} else {
name2 = "Привет, " + name + ". Съешь ещё этих мягких французских булочек да выпей чаю!";
}
return name2;
}
function sum(s1, s2, cycle=false){
s1 = s1|0;
s2 = s2|0;
var ret = 0|0;
if( cycle ) {
for(var i=0; 50000000>i; i++ ){
ret = (s1 + s2)|0;
}
} else {
ret = (s1 + s2)|0;
}
return ret;
}
return { hello: hello, sum: sum }
}
function js(stdlib, foreign, buffer){
function hello(name, cycle=false){
var name2 = "";
if( cycle ) {
for(var i=0; 50000000>i; i++ ){
name2 = "Привет, " + name + ". Съешь ещё этих мягких французских булочек да выпей чаю!";
}
} else {
name2 = "Привет, " + name + ". Съешь ещё этих мягких французских булочек да выпей чаю!";
}
return name2;
}
function sum(s1, s2, cycle=false){
s1 = s1|0;
s2 = s2|0;
var ret = 0|0;
if( cycle ) {
for(var i=0; 50000000>i; i++ ){
ret = (s1 + s2)|0;
}
} else {
ret = (s1 + s2)|0;
}
return ret;
}
return { hello: hello, sum: sum }
}
var test_asm = asm(window, null, null);
var test_js = js(window, null, null);
console.info("---- Цикл внутри функций ----");
console.time('asm-hello-cycle');
test_asm.hello("Вася", true);
console.timeEnd('asm-hello-cycle');
console.time('js-hello-cycle');
test_js.hello("Вася", true);
console.timeEnd('js-hello-cycle');
console.time('asm-sum-cycle');
test_asm.sum(5000, 10000, true);
console.timeEnd('asm-sum-cycle');
console.time('js-sum-cycle');
test_js.sum(5000, 10000, true);
console.timeEnd('js-sum-cycle');
console.info("---- Функции вызываются в цикле ----");
console.time('asm-hello');
for(var i=0; 50000000>i; i++ ){
test_asm.hello("Вася");
}
console.timeEnd('asm-hello');
console.time('js-hello');
for(var i=0; 50000000>i; i++ ){
test_js.hello("Вася");
}
console.timeEnd('js-hello');
console.time('asm-sum');
for(var i=0; 50000000>i; i++ ){
test_asm.sum(5000, 10000);
}
console.timeEnd('asm-sum');
console.time('js-sum');
for(var i=0; 50000000>i; i++ ){
test_js.sum(5000, 10000);
}
console.timeEnd('js-sum');
console.info("--------");
Типичный результат на моём компьютере в хроме:
Код:
|
---- Цикл внутри функций ----
asm-hello-cycle: 3100.053955078125ms
js-hello-cycle: 3169.260986328125ms
asm-sum-cycle: 35.586181640625ms
js-sum-cycle: 204.694091796875ms
---- Функции вызываются в цикле ----
asm-hello: 3874.47705078125ms
js-hello: 2499.636962890625ms
asm-sum: 805.5888671875ms
js-sum: 192.636962890625ms
-------- |
Выводы:
- asm.js оптимизирует только математические функции;
- строковый тип вообще отсутствует (пока?). В результате выигрыш на операциях со строками у asm.js настолько мал, что иногда даже показывает результат хуже чем на js (видимо влияют внешние факторы);
- вызов ф-ии asm.js очень дорогой, имеет смысл использовать только при большом кол-ве математических действий внутри неё;
В общем, на моих сайтоклепательских задачах от asm.js не будет никакой пользы