2016-07-12 5 views
0

Ich war neugierig, die Geschwindigkeitsunterschiede zwischen Arrays und Objekten zu sehen, also habe ich einen Test zum Füllen, Zugreifen auf und Löschen von 100.000 Elementen aus einem Array und einem Objekt eingerichtet. Der Zugriff und das Füllen des Arrays waren ungefähr gleich mit ~ 3 ms Unterschied. Das Löschen aus dem Array führte jedoch zu einem Unterschied von 604ms (10ms gegenüber 614ms). Warum ist das? Ich dachte, Objekte und Arrays wären ziemlich gleich.Warum ist das Löschen von einem Objekt schneller als das Splicing Array?

Demo: https://codecanister.com/Project/b9f8de7c/1/result/

+1

Funktionsaufrufe sind teuer! Es gibt einen großen Unterschied zwischen dem 'delete' Schlüsselwort und der' .splice' Funktion. – undefined

+0

Sie sollten niemals Datum für die Zeitmessung verwenden. Verwenden Sie stattdessen "performance.now();". – Mick

+0

Aktualisiert, noch ca. 600 ms Differenz. – jlynch630

Antwort

2

Wenn Sie das tun .splice(), alle nachfolgenden Array-Einträge neu zugewiesen werden müssen. Das heißt, jeder Eigenschaftsname nach dem Ausgespleißten muss geändert werden. Es gibt keinen guten Weg, das zu tun, außer einer geradlinigen linearen Durchquerung der Eigenschaften; Eine Datenstruktur, die diese Operation beschleunigt, würde andere, häufigere Operationen verlangsamen.

Betrachten Sie also das Array [1, 2, 3, 4]. Der Wert der Eigenschaft "0" ist 1. Wenn Sie diesen Eintrag spleißen, muss die Laufzeit die Eigenschaft "0" auf 2, die Eigenschaft "1" auf 3 und die Eigenschaft "2" auf 4 setzen.

0

Sie führen nur verschiedene Aktionen aus. "delete" setzt die Array-Position einfach auf undefined. Spleiß wird es vollständig entfernen, indem es eine Schleife mit arr [i] = arr [i + 1] für alle 10.000 Elemente Ihres Arrays durchführt. Sie tun dies für alle 10.000 Artikel. Siehe auch this question

+0

"So weit wie ich sehe Ihr Objekt" obj "ist ein Array," --- ist es? – zerkms

+1

"" delete "wird die Array-Position einfach auf undefiniert setzen" --- tut es nicht, es erzeugt ein Loch in einem Array. – zerkms

+0

Es ist anders, dass nur undefiniert gesetzt wird, da die Position von foreach und map-Funktion ignoriert wird. – bormat