2013-06-16 7 views
6

Mi chiedo perché lo stesso codice JavaScript sia considerevolmente più lento in un componente aggiuntivo di FireFox (utilizzando l'SDK dell'add-on) piuttosto che nell'esecuzione diretta in una pagina Web caricata in FireFox.Perché JavaScript è più lento in un componente aggiuntivo di FireFox rispetto a una pagina Web caricata in FireFox?

Per esempio, questo codice:

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); 

richiede meno di 2 secondi per l'esecuzione in una pagina web aperta in Firefox, ma richiede circa 15 secondi per l'esecuzione in un add-on Firefox.

So che il codice potrebbe essere migliore, ma è solo un esempio per mostrare quanto sia lento.

Perché è così lento in un componente aggiuntivo di FireFox?

C'è un modo per farlo più velocemente (senza modificare questo codice poiché è, come ho detto sopra, solo un esempio)?

Aggiornamento:

sembra essere legato alla Add-on SDK. Ho fatto un altro test: ho eseguito lo stesso codice in un add-on che non utilizza l'SDK aggiuntivo e il codice eseguito in circa 3 secondi.

Perché una differenza così grande (3 secondi contro 15 secondi) tra un componente aggiuntivo che utilizza l'SDK aggiuntivo e un componente aggiuntivo che non lo utilizza?

+0

Quando è stato il codice viene eseguito? Come il browser era sotto pesante carico perché si stava avviando? –

+0

Probabilmente sto dicendo una cosa stupida, e sicuramente qualcuno mi smentirà, ma è possibile che la pagina web "memorizzi" i risultati di 'isPrime' mentre l'add-on no? –

+0

Questo codice è stato caricato all'avvio del browser. Ma ho provato a eseguire questo codice con un clic del mouse ed è lento. E non so se c'è qualche cache. – antoyo

risposta

1

Esistono due preferenze (accessibili dalla pagina about:config) che controllano le ottimizzazioni javascript: javascript.options.methodjit.chrome per codice privilegiato (estensioni) e javascript.options.methodjit.content per codice non affidabile (pagine Web).

Alcune versioni di Firefox vengono disabilitate per impostazione predefinita.

Controllare javascript.options.methodjit.chrome per verificare se è impostato su true.

+2

questa risposta ha bisogno di maggiori dettagli. per favore spiega all'OP cosa fa questa opzione di pref, come trovarla, ecc. Altrimenti, così com'è, la risposta dovrebbe essere un commento piuttosto che una risposta. – Spudley

+0

È vero. Cosa significa? – antoyo

+0

@antoyo Il punto di base è che JavaScript JIT (o almeno uno di essi, ce ne sono diversi in Firefox che si innescano in punti diversi) può essere disabilitato indipendentemente nelle estensioni e nelle pagine web. Quindi è possibile che il codice nella pagina Web sia JITted e che il codice nell'estensione non lo sia. –

Problemi correlati