2013-07-30 2 views
30

Я пытаюсь понять, как именно работает ASM и когда он умирает.Firefox не кажется, быстрее, используя профиль asm.js, пока Хром

Я взял небольшую функцию с сайта 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

The производительности показывает, что светлячок 22 является самым медленным с ассемблером -syntax (с аннотацией «use asm» или без него), а хром быстрее в asm-режиме.

Так что мой вопрос: как это возможно? Я ожидаю, что Firefox будет самым быстрым в режиме asm. Я бы не ожидал увидеть разницу для Chrome. Я использую неправильный синтаксис asm? Что мне не хватает?

Любые рекомендации или разъяснения приветствуются. Спасибо,

+0

Я ничего не знаю о любой ASM, но почему вы думаете, что Firefox будет быстрее? Вы знаете, что они используют разные движки JavaScript, не так ли? Все браузеры отличаются производительностью – Ian

+0

Вызовите функцию один раз в настройке (для запуска компиляции), а затем увидите результат – SheetJS

+3

@Ian: OP сравнивает ASM и код без ASM в каждом браузере, чтобы увидеть разницу, которую он делает. Chrome не поддерживает ASM-оптимизации AFAIK, поэтому аннотация не должна иметь никакого значения, в то время как FireFox ее поддерживает. OP не сравнивает FF с Chrome. –

ответ

7

Когда вы запускаете код в Firefox, вы часто можете увидеть огромное снижение скорости вызовов asm.js, что, скорее всего, вызвано повторной компиляцией (которая видна на консоли) или стоимостью js-to -asm звонит. Эта гипотеза дополнительно усилены Luke Wagner, реализатор asm.js:

one performance fault that we already know trips up people trying to benchmark asm.js is that calling from non-asm.js into asm.js and vice versa is much slower than normal calls due to general-purpose enter/exit routines. We plan to fix this in the next few months but, in the meantime, for benchmarking purposes, try to keep the whole computation happening inside a single asm.js module, not calling in and out.

Чтобы увидеть его для себя - смотрите на скрипку: http://jsperf.com/asm-simple/10

  • Firefox 26: 22,600K OPS/сек в случай asm-asm vs (!) in asm-js кейс.
  • Chrome 28: 18К против 13К
  • IE11: ~ 7.5К для всех тестов, нет большой разницы не наблюдалось, для мертвого кода ellimination, где блестит кроме;)
+0

// не знаю, если предупреждение 'TypeError: ошибка типа asm.js: аргументы для сравнения должны быть как подписаны, так и без знака или удваиваются; int и int заданы 'является подлинной или ошибкой. Наблюдаемое ускорение скорости заставляет меня верить в его простое нежелательное сообщение. – c69