2013-06-16 12 views
6

Zastanawiam się, dlaczego ten sam kod JavaScript jest znacznie wolniejszy w dodatku FireFox (przy użyciu dodatku SDK), niż działa bezpośrednio na stronie załadowanej w FireFox.Dlaczego JavaScript jest wolniejszy w dodatku FireFox niż na stronie załadowanej w FireFox?

Na przykład, ten kod:

function isPrime(number) { 
    var i, 
     prime = true; 
    for(i = 2 ; i < number ; ++i) { 
     if(number % i === 0) { 
      prime = false; 
     } 
    } 
    return prime; 
} 

function sumFirstPrimeNumbers(x) { 
    var i, 
     sum = 0; 
    for(i = 1 ; i <= x ; ++i) { 
     if(isPrime(i)) { 
      sum += i; 
     } 
    } 
    return sum; 
} 

var sum = sumFirstPrimeNumbers(15000); 

console.log(sum); 

zajmuje mniej niż 2 sekundy, aby uruchomić na stronie internetowej otwarty w FireFox, ale trwa około 15 sekund, aby uruchomić w Firefoxa.

Wiem, że kod mógłby być lepszy, ale jest to tylko przykład pokazujący, jak powolny jest.

Dlaczego jest tak wolno w dodatku FireFox?

Czy jest jakiś sposób, aby uzyskać to szybciej (bez zmiany tego kodu, ponieważ jest, jak powiedziałem powyżej, tylko przykład)?

Aktualizacja:

Wydaje się być związane z Add-on SDK. Zrobiłem kolejny test: wykonałem ten sam kod w dodatkach, które nie używają dodatkowego pakietu SDK, a kod wykonuje się w ciągu około 3 sekund.

Dlaczego tak duża różnica (3 sekundy w stosunku do 15 sekund) między dodatkiem przy użyciu dodatku SDK i dodatkiem, który go nie używa?

+0

Kiedy kod jest prowadzony? Ponieważ przeglądarka była obciążona dużym obciążeniem, ponieważ była uruchamiana? –

+0

Prawdopodobnie mówię głupią rzecz, i na pewno ktoś mnie obali, ale czy jest możliwe, że strona internetowa "buforuje" wyniki 'isPrime', podczas gdy dodatek nie działa? –

+0

Ten kod został załadowany podczas uruchamiania przeglądarki. Ale próbowałem uruchomić ten kod po kliknięciu przycisku i jest tak wolny. I nie wiem, czy jest jakaś pamięć podręczna. – antoyo

Odpowiedz

1

Istnieją dwa preferencje (dostępne ze strony about:config), które kontrolują optymalizacje javascript: javascript.options.methodjit.chrome dla kodu uprzywilejowanego (rozszerzenia) i javascript.options.methodjit.content dla niezaufanego kodu (strony internetowe).

Niektóre wersje Firefoksa są dostarczane domyślnie z wcześniejszymi wyłączonymi.

Sprawdź, czy jest ustawiony na javascript.options.methodjit.chrome na true.

+2

ta odpowiedź wymaga więcej szczegółów. proszę wyjaśnić OP, co robi ta opcja, jak ją znaleźć itp. W przeciwnym razie odpowiedź powinna być komentarzem, a nie odpowiedzią. – Spudley

+0

To prawda. Co to znaczy? – antoyo

+0

@antoyo Podstawową kwestią jest to, że JIT JavaScript (lub przynajmniej jeden z nich, jest kilka w Firefoksie, które uruchamiają się w różnych punktach) może być niezależnie wyłączony w rozszerzeniach i na stronach internetowych. Jest więc możliwe, że kod na stronie internetowej jest JITted, a kod w rozszerzeniu nie jest. –