Firefox, похоже, не работает быстрее, используя профиль asm.js, но Chrome
Я пытаюсь понять, как работает 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? Что мне не хватает?
Приветствуются любые советы или разъяснения. Спасибо,
Ответы
Ответ 1
Когда вы запускаете код в Firefox, вы часто можете увидеть значительное снижение скорости для вызовов asm.js, что, скорее всего, вызвано повторной компиляцией (которая видна на консоли) или стоимостью js-to-asm-вызовов, Эта гипотеза еще более усиливается Люк Вагнер, разработчик asm.js:
одна ошибка производительности, которую мы уже знаем, попытка сопоставления asm.js заключается в том, что вызов из non-asm.js в asm.js и наоборот намного медленнее, чем обычные вызовы из-за общедоступные процедуры ввода/выхода. Мы планируем исправить это в следующем несколько месяцев, но, тем временем, для целей бенчмаркинга, попробуйте сохраняйте все вычисления в одном модуле asm.js, не призывая и не выходить.
Чтобы убедиться в этом сами - посмотрите на скрипку: http://jsperf.com/asm-simple/10
- Firefox 26: 22,600K ops/sec в случае asm-asm vs 300 (!) в случае asm-js.
- Chrome 28: 18K против 13K
- IE11: ~ 7.5K для всех тестов, не наблюдается большой разницы, кроме эллиминации мертвого кода, где он сияет;)