2013-06-16 4 views
6

Ich frage mich, warum derselbe JavaScript-Code in einem FireFox-Add-On (mit dem Add-on-SDK) wesentlich langsamer ist als direkt auf einer in FireFox geladenen Webseite.Warum ist JavaScript in einem FireFox-Add-On langsamer als auf einer in FireFox geladenen Webseite?

Zum Beispiel dieser Code:

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

dauert weniger als 2 Sekunden in einer Webseite in FireFox, aber dauert etwa 15 Sekunden in einem Firefox-Add-on laufen geöffnet laufen.

Ich weiß, der Code könnte besser sein, aber es ist nur ein Beispiel, um zu zeigen, wie langsam es ist.

Warum ist es so langsam in einem FireFox Add-on?

Gibt es eine Möglichkeit, es schneller zu bekommen (ohne diesen Code zu ändern, da es, wie ich oben sagte, nur ein Beispiel ist)?

Update:

Es scheint das Add-on SDK zusammenzuhängen. Ich habe einen weiteren Test gemacht: Ich habe den gleichen Code in einem Add-On ausgeführt, der das Add-on-SDK nicht verwendet, und der Code wird in ungefähr 3 Sekunden ausgeführt.

Warum ein so großer Unterschied (3 Sekunden vs. 15 Sekunden) zwischen einem Add-on, das das Add-On-SDK verwendet, und einem Add-On, das es nicht verwendet?

+0

Wann wurde der Code des ausgeführt wird? Da der Browser stark ausgelastet war, weil er gestartet wurde? –

+0

Ich erzähle wahrscheinlich eine dumme Sache, und sicherlich wird mich jemand widerlegen, aber ist es möglich, dass die Webseite die Ergebnisse von 'isPrime'" zwischenspeichert ", während das Add-on das nicht tut? –

+0

Dieser Code wurde beim Starten des Browsers geladen. Aber ich habe versucht, diesen Code auf einen Klick auszuführen und es ist so langsam. Und ich weiß nicht, ob es einen Cache gibt. – antoyo

Antwort

1

Es gibt zwei Einstellungen (erreichbar von der about:config Seite), die die JavaScript-Optimierungen steuern: javascript.options.methodjit.chrome für privilegierten Code (Erweiterungen) und javascript.options.methodjit.content für nicht vertrauenswürdigen Code (Web-Seiten).

Einige Versionen von Firefox werden standardmäßig mit dem vorherigen ausgeliefert.

Überprüfen Sie javascript.options.methodjit.chrome, um zu sehen, ob es auf true eingestellt ist.

+2

Diese Antwort benötigt mehr Details. Bitte erläutern Sie dem OP, was diese Option vorgibt, wie sie zu finden ist, usw. Ansonsten sollte die Antwort eher ein Kommentar als eine Antwort sein. – Spudley

+0

Es ist wahr. Was heißt das? – antoyo

+0

@antoyo Der grundlegende Punkt ist, dass JavaScript JIT (oder mindestens einer von ihnen; es gibt mehrere in Firefox, die an verschiedenen Punkten auslösen) unabhängig voneinander in Erweiterungen und in Webseiten deaktiviert werden kann. Es ist also möglich, dass der Code in der Webseite JITted ist und der Code in der Erweiterung nicht. –

Verwandte Themen