Ich versuche mit dieser Antwort ein breites Bild zu vermitteln.
Die folgenden Gedanken in Klammern waren meine Überzeugung, bis ich das Problem erst kürzlich getestet habe:
[[In Bezug auf Low-Level-Sprachen wie C / C ++ wird der Code so kompiliert, dass der Prozessor einen speziellen bedingten Sprungbefehl hat, wenn eine Variable Null (oder nicht Null) ist.
Wenn Sie sich für so viel Optimierung interessieren, können Sie ++i
stattdessen auch gehen i++
, da dies ++i
ein einzelner Prozessorbefehl ist, während i++
bedeutet j=i+1, i=j
.]]
Wirklich schnelle Schleifen können durch Abrollen erstellt werden:
for(i=800000;i>0;--i)
do_it(i);
Es kann viel langsamer sein als
for(i=800000;i>0;i-=8)
{
do_it(i); do_it(i-1); do_it(i-2); ... do_it(i-7);
}
Die Gründe hierfür können jedoch recht kompliziert sein (nur um zu erwähnen, dass es im Spiel Probleme mit der Vorverarbeitung von Prozessorbefehlen und der Cache-Behandlung gibt).
In Bezug auf Hochsprachen wie JavaScript können Sie die Dinge optimieren, wenn Sie sich auf Bibliotheken und integrierte Funktionen für Schleifen verlassen. Lassen Sie sie entscheiden, wie es am besten gemacht wird.
Folglich würde ich in JavaScript vorschlagen, so etwas wie zu verwenden
array.forEach(function(i) {
do_it(i);
});
Es ist auch weniger fehleranfällig und Browser haben die Möglichkeit, Ihren Code zu optimieren.
[BEMERKUNG: Nicht nur die Browser, sondern auch Sie haben einen Platz zum einfachen Optimieren. Definieren Sie die forEach
Funktion einfach neu (browserabhängig), damit die neuesten Tricks verwendet werden! :) @AMK sagt in besonderen Fällen, dass es sich lohnt, lieber array.pop
oder zu verwenden array.shift
. Wenn Sie das tun, stellen Sie es hinter den Vorhang. Der größte Overkill besteht darin, Optionen forEach
zur Auswahl des Schleifenalgorithmus hinzuzufügen .]
Darüber hinaus empfiehlt es sich, auch für einfache Sprachen, eine intelligente Bibliotheksfunktion für komplexe Schleifenoperationen zu verwenden, wenn dies möglich ist.
Diese Bibliotheken können auch Dinge (Multithreading) hinter Ihren Rücken legen, und auch spezialisierte Programmierer halten sie auf dem neuesten Stand.
Ich habe etwas genauer nachgesehen und es stellt sich heraus, dass es in C / C ++ selbst bei 5e9 = (50.000x100.000) Operationen keinen Unterschied zwischen Auf und Ab gibt, wenn die Tests gegen eine Konstante durchgeführt werden, wie @alestanis sagt. (JsPerf-Ergebnisse sind manchmal inkonsistent, sagen aber im Großen und Ganzen dasselbe: Sie können keinen großen Unterschied machen.)
Das --i
ist also eher eine "noble" Sache. Sie sehen nur wie ein besserer Programmierer aus. :) :)
Andererseits hat mich das Abrollen in dieser 5e9-Situation von 12 Sekunden auf 2,5 Sekunden, wenn ich um 10 Sekunden ging, und auf 2,1 Sekunden, wenn ich um 20 Sekunden ging, gesenkt. Es war ohne Optimierung, und die Optimierung hat die Dinge auf unermessliche Zeit reduziert. :) (Das Abrollen kann auf meine oben beschriebene Weise oder mithilfe von erfolgen i++
, aber das bringt in JavaScript keine Fortschritte .)
Alles in allem: Behalten Sie i--
/ i++
und ++i
/ oder i++
Unterschiede zu den Vorstellungsgesprächen bei, halten Sie sich an array.forEach
oder andere komplexe Bibliotheksfunktionen, sofern verfügbar. ;)