2012-04-16 7 views
5

Ich arbeite seit 4 Monaten am Webprojekt. Um die Code-Performance zu optimieren, haben wir ein Muster verwendet. Mein Zweifel ist, erhöht es tatsächlich Leistung oder nicht?Javascript dieses Objekt

Wenn wir jemals this Objekt verwenden müssen, weisen wir es einer lokalen Variablen zu und verwenden diese.

function someFunction() 
{ 
    var thisObject = this; 
    //use thisObject in all following the code. 
} 

die hier davon ausgegangen, dass die Zuordnung this Objekt zu einem lokalen Stack Variable, die die Leistung steigern.

Ich habe diese Art der Codierung nirgends gesehen so zweifeln, ob es keinen Nutzen hat.

BEARBEITEN: Ich weiß, dass das Zuweisen dieses Objekts zu lokalen Variablen für die Erhaltung des Objekts getan wird, aber das ist nicht unser Fall.

+1

Es ist sehr häufig in Node.js Sachen. Aber das ist mehr für eine Referenz in Callbacks, im Gegensatz zu einer Leistungssteigerung, glaube ich. – Chad

+1

Ich werde raten, dass das eigentlich * schlechter * für die Leistung ist. Der Google Closure-Compiler (mit erweiterten Optimierungen) entfernt die var-Deklaration und ersetzt Instanzen von thisObject durch this, obwohl die Verwendung einer Variablen häufig zu einer kleineren Größe führt. Der Closure-Compiler optimiert die Geschwindigkeit und Größe, scheint aber die Geschwindigkeit gegenüber der Größe zu bevorzugen, wenn er die Wahl hat. –

Antwort

7

Während dies eine gängige Praxis in Javascript ist es nicht aus Leistungsgründen getan. Das Speichern des this Objekts in einem anderen Named Local wird normalerweise vorgenommen, um den Wert this über Callbacks zu erhalten, die in der Funktion definiert sind.

function someFunction() { 
    var thisObject = this; 
    var someCallback = function() { 
    console.log(thisObject === this); // Could print true or false 
    }; 
    return someCallback; 
} 

Unabhängig davon, ob thisObject === this true ausgewertet wird davon abhängen, wie es

var o = {} 
o.someFunction = someFunction(); 
var callback = o.someFunction(); 
callback();  // prints false 
callback.call(o); // prints true 
+0

haben wir dieses Muster in einfachen Funktionen verwendet, die keine Rückrufe oder so haben. Was ich wissen möchte ist, hat es irgendwelche Leistungssteigerung? –

+0

@TejeshAlimilli ist es sehr unwahrscheinlich, dass dies einen merklichen Leistungsunterschied hat – JaredPar

+0

Danke. das ist was ich wissen wollte. –

0

Selbst genannt wird, wenn diese Art der Optimierung hat eine (positive) Wirkung, ist es sehr wahrscheinlich ist, auf dem Dolmetscher angewiesen.

Eine andere Version kann die Ergebnisse wiederherstellen.

Aber am Ende sollten Sie messen, nicht raten.

2

Wie bei ALLEN Leistungsfragen sollten sie untersucht werden, indem die Leistung tatsächlich gemessen wird. In einem rather simple test case (Ihr tatsächlichen Code könnte einige variieren), ich gemischte Ergebnisse für den Browser:

enter image description here

Chrome und Firefox nicht sehr viel zwischen den beiden Tests unterscheiden, aber der geringen Unterschied ist gegens Richtungen zwischen den beiden. IE9 zeigt den Test unter Verwendung einer gespeicherten Kopie von this, die ich self nannte, um wesentlich langsamer zu sein.

Ohne einen signifikanten und konsistenten Leistungsunterschied in Chrome und Firefox und IE9, der den this Testfall wesentlich schneller zeigt, können Sie daraus schließen, dass das von Ihnen gewünschte Designmuster keine konsistente Leistungssteigerung in den Browsern liefert.

In meinem Code, speichere ich eine Kopie von this nur auf einem andere Variable, wenn ich es für einen konsequenten Bezug auf das ursprüngliche Objekt innerhalb von Inline-Event-Handler, Rückrufen oder Methoden muß, wo this hat, um etwas anderes festgelegt wurde. Mit anderen Worten, ich wende dieses Designmuster nur bei Bedarf an.

In einem previous discussion of this design pattern here on SO, wurde der Schluss gezogen, dass einige Bibliotheken dieses Entwurfsmuster verwenden, um zusätzliche Minimierung zu ermöglichen, weil this nicht unter den vier Zeichen minimieren werden kann, die es in Anspruch nimmt, aber es zu einem lokal Variablen zuweisen kann eine minimierte werden Einzelzeichen variabler Name.

+0

Opera scheint den Testfall mikrooptimiert zu haben, sie laufen genau in der gleichen Zeit :-) – Bergi