Próbuję dać szeroki obraz tej odpowiedzi.
Poniższe myśli w nawiasach było moim przekonaniem, dopóki nie przetestowałem tego problemu:
[[W odniesieniu do języków niskiego poziomu, takich jak C / C ++ , kod jest kompilowany, dzięki czemu procesor ma specjalne polecenie skoku warunkowego, gdy zmienna ma wartość zero (lub niezerową).
Ponadto, jeśli zależy ci na takiej optymalizacji, możesz ++i
zamiast tego przejść i++
, ponieważ ++i
jest to polecenie jednego procesora, a jednocześnie i++
oznaczaj=i+1, i=j
.]]
Naprawdę szybkie pętle można wykonać, rozwijając je:
for(i=800000;i>0;--i)
do_it(i);
Może być znacznie wolniejszy niż
for(i=800000;i>0;i-=8)
{
do_it(i); do_it(i-1); do_it(i-2); ... do_it(i-7);
}
ale przyczyny tego mogą być dość skomplikowane (aby wspomnieć, istnieją problemy związane z przetwarzaniem poleceń procesora i obsługą pamięci podręcznej w grze).
Pod względem języków wysokiego poziomu , takich jak JavaScript o które prosiłeś, możesz zoptymalizować rzeczy, jeśli polegasz na bibliotekach, wbudowanych funkcjach zapętlania. Pozwól im zdecydować, jak najlepiej to zrobić.
W związku z tym w JavaScript sugerowałbym użycie czegoś takiego
array.forEach(function(i) {
do_it(i);
});
Jest również mniej podatny na błędy, a przeglądarki mają szansę zoptymalizować kod.
[UWAGA: nie tylko przeglądarki, ale także masz przestrzeń do łatwej optymalizacji, po prostu ponownie zdefiniuj forEach
funkcję (zależnie od przeglądarki), aby korzystała z najnowszych najlepszych sztuczek! :) @AMK mówi w szczególnych przypadkach, że warto raczej użyć array.pop
lub array.shift
. Jeśli to zrobisz, połóż go za zasłoną. Największą nadwyżką jest dodanie opcji forEach
wyboru algorytmu zapętlenia.]
Ponadto, również w przypadku języków niskiego poziomu, najlepszą praktyką jest użycie inteligentnej funkcji bibliotecznej do złożonych, zapętlonych operacji, jeśli jest to możliwe.
Te biblioteki mogą również umieszczać różne elementy (wielowątkowe) za twoimi plecami, a także wyspecjalizowani programiści utrzymują je na bieżąco.
Zrobiłem trochę więcej kontroli i okazuje się, że w C / C ++, nawet dla operacji 5e9 = (50 000 x 100 000), nie ma różnicy między przechodzeniem w górę i w dół, jeśli testowanie odbywa się na stałej, jak mówi @alestanis. (Wyniki JsPerf są czasami niespójne, ale ogólnie rzecz biorąc mówią to samo: nie można zrobić dużej różnicy.)
Tak więc --i
zdarza się, że jest to raczej „elegancka” rzecz. To tylko sprawia, że wyglądasz jak lepszy programista. :)
Z drugiej strony, za rozwinięcie w tej sytuacji 5e9, zmniejszyłem mnie z 12 sekund do 2,5 sekundy, gdy przekroczyłem 10 sekund, i do 2,1 sekundy, kiedy przekroczyłem 20s. To było bez optymalizacji, a optymalizacja sprowadziła rzeczy do niezmierzonego krótkiego czasu. :) (Rozwijanie można wykonać na swój sposób powyżej lub przy użyciu i++
, ale to nie przyspiesza działania w JavaScript.)
Podsumowując: zachowaj i--
/ i++
i ++i
/ i++
różnice w rozmowach kwalifikacyjnych, trzymaj się array.forEach
lub innych złożonych funkcji bibliotecznych, jeśli są dostępne. ;)