sortieren - javascript mehrdimensionales array




Warum wird ein Array schneller rückwärts als vorwärts durchlaufen? (5)

Mit diesem Code:

var arr = [];

for (var i = 0; i < 10000; ++i)
    arr.push(1);

Vorwärts

for (var i = 0; i < arr.length; ++i) {}

Rückwärts

for (var i = arr.length - 1; i >= 0; --i) {}

Hartcodierte Forward

for (var i = 0; i < 10000; ++i) {}

Warum ist rückwärts so viel schneller?

Hier ist der Test: http://jsperf.com/array-iteration-direction


Denn in der ersten Form greifen Sie für jede Iteration einmal auf die Eigenschaftslänge des Arrays arr zu, in der zweiten nur einmal.


Ich bin mir nicht ganz sicher, aber hier ist meine Vermutung:

Für den folgenden Code:

for (var i = 0; i < arr.length; ++i) {;
}

Zur Laufzeit gibt es nach jedem Schleifendurchlauf eine arr.length-Berechnung. Dies kann eine triviale Operation sein, wenn es alleine steht, aber kann sich auswirken, wenn es um mehrere / riesige Arrays geht. Können Sie Folgendes versuchen:

 var numItems = arr.length;
    for(var i=0; i< numItems; ++i)
    {
    }

In dem obigen Code berechnen wir die Array-Länge nur einmal und arbeiten mit dieser berechneten Zahl, anstatt die Längenberechnung immer wieder auszuführen.

Wieder, nur meine Gedanken hier draußen. Interessante Beobachtung in der Tat!


Weil Ihre Weiterleitungsbedingung jedes Mal die length -Eigenschaft Ihres Arrays erhalten muss, während die andere Bedingung nur nach "größer als Null" suchen muss, eine sehr schnelle Aufgabe.

Wenn sich Ihre Array-Länge während der Schleife nicht ändert und Sie wirklich auf ns-performance schauen, können Sie verwenden

for (var i=0, l=arr.length; i<l; i++)

BTW: Statt for (var i = arr.length; i > 0; --i) könnten Sie for (var i = arr.length; i-- > 0; ) das wirklich von n-1 durch Ihr Array läuft zu 0, nicht von n zu 1.


Wenn Sie sie im gleichen Tempo haben wollen, können Sie das für die Vorwärtsiteration tun;

for(var i=0, c=arr.length; i<c; i++){
}

Also muss Ihr Skript nicht immer die Länge des Arrays einnehmen.


i > 0 ist schneller als i < arr.length und tritt bei jeder Iteration der Schleife auf.

Sie können den Unterschied damit mildern:

for (var i = 0, len = arr.length; i < len; ++i) {;
}

Dies ist immer noch nicht so schnell wie der Rückwärtsartikel, aber schneller als die Weiterleitungsoption.





optimization