2015-05-12 12 views
6

Warum ist v1 so viel langsamer als v2?Leistungsprobleme beim Speichern von Objektreferenzen auf Array

v1 -

var foo = function (a,b,c) { 
    this.a=a; this.b=b; this.c=c; 
} 
var pcs = new Array(32); 
for (var n=32; n--;) { 
    ref = new foo(1,2,3) 
    pcs[n] = ref; //***** 
} 

v2 -

var foo = function (a,b,c) { 
    this.a=a; this.b=b; this.c=c; 
} 
var pcs = new Array(32); 
for (var n=32; n--;) { 
    ref = new foo(1,2,3) 
    pcs[n] = 1; //***** 
} 

Ich dachte, da ich einen Verweis auf das neue Objekt in 'ref' halten, dass einfach, dass die Bezugnahme auf eine Zuordnung Das Element im Array würde ungefähr so ​​schnell sein wie die Zuweisung eines Literalwerts, aber es stellt sich heraus, dass die Zuweisung der Referenz wesentlich langsamer ist. Kann jemand etwas Licht dazu bringen? Alles, was ich tun kann, um die Leistung hier auf V1 zu verbessern?

Fiddle:

http://jsfiddle.net/a0kw9rL1/1/

+0

wo Schleife beenden Zustand? – ozil

+0

@ozil: Wo immer es ist, der zweite Teil des 'for'" Headers ",' n - '. Wenn es "0" zurückgibt, wird die Schleife beendet. –

+0

@ Felix Kling, was es nicht nach '0' dekrementiert – ozil

Antwort

3

einfach, dass der Bezug auf ein Element in dem Array Zuweisen etwa so schnell wäre, als einen literalen Wert zuweisen

Ja, es ist im Grunde . Die Zuordnung eines Objekts macht hier jedoch wahrscheinlich den Unterschied.
In V2, ref wird nur einmal zugewiesen und wiederholt überschrieben, könnte es auf dem Stapel nicht auf dem Heap zugeordnet werden, und tote Code Eliminierung könnte sogar vollständig weg optimieren.
In V1 muss ref auf dem Heap und wiederholt an einem neuen Speicherort zugewiesen werden, da auf alle Instanzen von pcs zugegriffen werden kann.

V1 isst nur mehr Speicher als V21. Aufgrund Ihrer sehr kleinen Anordnung ist der Unterschied jedoch vernachlässigbar. Wenn Sie wirklich große verwenden, können Sie den Unterschied erkennen: http://jsperf.com/array-reference-assignment/3

[1]: Nun, aus irgendeinem Grund not really. Aber ich kann das nicht erklären, außer Garbage Collection ist anders, wenn Sie Speicherverbrauch profilieren

+0

Ich denke, das ist die richtige Antwort, außer dass 'V1' und 'V2' in der aktuellen Version umgekehrt sind. Möglicherweise würde dieses Update (wenn Sie mir zustimmen) akzeptiert werden. – BPS

+0

@Bergi _ "es könnte auf dem Stapel nicht auf dem Heap zugeordnet werden" _ Kann "Stapel", "Heap" beschreiben; Unterschiede zwischen den beiden? , für einen Betrachter, der keinen Lay-Bezugspunkt für diese Begriffe in der Informatik hat? – guest271314

+1

@ guest271314: [stack] (https://en.wikipedia.org/wiki/Stack-based_memory_allocation) vs [heap] (https://en.wikipedia.org/wiki/Memory_management#Dynamic_memory_allocation). – Bergi

Verwandte Themen