2013-07-30 14 views
30

Próbuję zrozumieć, jak dokładnie działa ASM, a kiedy w rzutach.Firefox nie wydają się być szybciej przy użyciu profilu asm.js, ale Chrome jest

Wziąłem małą funkcję ze strony asm.js . Pakuję go za pomocą wzorca modułu: raz dla asm, raz z tą samą składnią, ale bez adnotacji "use asm" i raz jak z wanilią-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); 
    }; 
}()) 

utworzonego małą jsperf: kod jsperf nieznacznie różni się od powyższego, wskazówki zawierające od gwintu dyskusja poniżej http://jsperf.com/asm-simple/7

The wykonania pokazuje, że zapalić 22 jest najwolniejszym z ASM -syntax (z lub bez adnotacji "use asm"), a chrome jest najszybsze w trybie asm.

Moje pytanie brzmi: jak to jest możliwe? Spodziewam się, że Firefox będzie najszybszy w trybie asm. Nie spodziewam się żadnej różnicy w Chrome. Czy używam niewłaściwej składni asm? czego mi brakuje?

Każda rada lub wyjaśnienie są mile widziane. Dzięki,

+0

nie wie nic o czymkolwiek jest ASM, ale dlaczego uważasz, że Firefox byłby najszybszy? Wiesz, że używają różnych silników JavaScript, prawda? Wszystkie przeglądarki różnią się wydajnością – Ian

+0

Wywołaj funkcję raz w ustawieniach (aby uruchomić kompilację), a następnie zobacz wynik: – SheetJS

+3

@Ian: OP porównuje kod ASM i kod spoza ASM w każdej przeglądarce, aby zobaczyć różnicę, jaką powoduje. Chrome nie obsługuje optymalizacji ASM AFAIK, więc adnotacja nie powinna mieć znaczenia, a FireFox ją obsługuje. OP nie porównuje FF z Chrome. –

Odpowiedz

7

Kiedy uruchamiasz kod w Firefoksie, często widzisz ogromny spadek szybkości wywołań asm.js, który najprawdopodobniej jest spowodowany wielokrotną kompilacją (widoczną w konsoli) lub kosztem js-to - wywołuje. Hipoteza ta jest dodatkowo wzmocniony przez Luke Wagner, implementor z 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.

Aby zobaczyć to na własne oczy - spojrzeć na skrzypcach: http://jsperf.com/asm-simple/10

  • Firefox 26: 22,600K ops/sec w obudowa asm-asm vs (!) w etui asm-js.
  • Chrome 28: 18K vs 13K
  • IE11: ~ 7.5K dla wszystkich testów, nie duża różnica zauważył wyjątkiem kodu martwego ellimination, gdzie jaśnieje;)
+0

// nie ma pojęcia, czy ostrzeżenie "TypeError: asm.js błąd typu: argumenty do porównania muszą być zarówno podpisane, unsigned lub double; int i int są podane "jest oryginalne lub jest błędem. Obserwowane przyspieszenie prędkości sprawia, że ​​wierzę, że jest to tylko wiadomość śmieciowa. – c69