2016-11-05 6 views
0

Nehmen wir an, ich habe eine Klasse MyClass mit einer Funktion method(), die viel genannt wird. Welche dieser Implementierungen wird effizienter sein?Kann die Speichernutzung reduziert werden, indem var vermieden wird?

function MyClass() { 
    this.method = function() { 
     var number = 10; 
     var boolean = true; 
     var string = "string"; 

     // do something 
    }; 
} 

function MyClass() { 
    this.data = {}; 
    this.method = function() { 
     this.data.number = 10; 
     this.data.boolean = true; 
     this.data.string = "string"; 

     // do something 
    }; 
} 

Die erste Implementierung schafft neue Variablen, die für die Garbage Collection nach der Ausführung der Funktion berechtigt sein wird, da es ihnen keinen Hinweis, was toll ist. Wenn ich die Funktion jedoch dreimal aufrufe, ist Speicher für insgesamt 3 Zahlen, 3 Boolesche und 3 Strings zugewiesen.

Die zweite Implementierung erstellt keine neuen Variablen, sondern überschreibt einfach die Werte des vorherigen Aufrufs der Funktion. Bedeutet dies, dass nach 3 Aufrufen der Funktion der zugewiesene Speicher nur für 1 Zahl, boolean und string statt 3? Wird wirklich 3 mal weniger Speicher verbraucht?

+0

Wenn Sie bereit sind, die Daten mit 'this.data = {}' zu entlarven, warum sollten Sie die Methode nicht einfach auf den 'MyClass.prototype' setzen? Das scheint die offensichtlichste Verbesserung zu sein, die Sie machen könnten. Was deine genaue Frage angeht, wer weiß. Hängt davon ab, wie die Implementierung optimiert wird. –

+0

... Gibt es aus irgendeinem Grund, auch wenn Sie diese Mitglieder nicht exponieren, ein neues Funktionsobjekt jedes Mal? Damit Ihr Code ordnungsgemäß funktioniert, steht er an erster Stelle. Wie bei allen Leistungsfragen lautet die Antwort danach, sie zu testen. –

+0

... auch 'data' im zweiten Beispiel greift nicht auf' this.data' zu. Also meinst du, dass 'this.data = {}' tatsächlich eine Variable ist? Oder meintest du 'this.data.number = 10'? –

Antwort

0

Der erste Ansatz ist besser, da die Variablen Methodenumfang sind und per GC gesammelt werden, sobald die Methodenausführung abgeschlossen ist. Aber denken Sie daran, wenn Sie diese Werte als Klassenmitglieder behalten müssen, dann wird diese Methode nicht funktionieren.

In einem zweiten Ansatz verbinden Sie diese Eigenschaften mit Klassenreferenz. GC wird es nicht sammeln, bis die Klasseninstanz mit einem Bereich referenziert wird.

+0

Warum ist das besser? Wenn die Methode immer wieder aufgerufen wird, warum ist es besser, diese Daten immer wieder zu erstellen, anstatt das Objekt erneut zu verwenden? Und welche Implementierung favorisiert die Performance? –

+0

Ich weiß, GC wird die Werte nicht sammeln. Mein Hauptziel ist es, die Speichernutzung zu minimieren. Und im ersten Beispiel reserviere ich immer wieder Speicher, während ich ihn im zweiten wiederverwende. Ich möchte wissen, ob ich ** wirklich ** Speicher wiederverwende und wenn ja, macht es tatsächlich einen Unterschied. –

0

Ihr zweiter Ansatz sieht sehr logisch und zugänglich aus. Ich glaube Code ist poetisch und es sagt viel über Ausdauer aus.

function MyClass() { 
    this.data = {}; 
    this.method = function() { 
     this.data.number = 10; 
     this.data.boolean = true; 
     this.data.string = "string"; 

     // do something 
    }; 
} 

Der obige Code sieht effizient und gut strukturiert aus, als jedes Mal mehr Klasse zu erstellen, wenn Ihre Klasse aufgerufen wird.

+3

Wie sieht "effizient" aus? –

+0

Was sollte Ihrer Meinung nach effizient aussehen? –

+0

Warum fragst du mich? Du bist derjenige, der behauptet, dass der Code "effizient aussieht" –

Verwandte Themen