Я намагаюся дати широку картину з цією відповіддю.
Наступні думки в дужках були моїми переконаннями, поки я нещодавно не перевірив це питання:
[[З точки зору мов низького рівня, таких як C / C ++ , код складається так, що процесор має спеціальну умовну команду стрибка, коли змінна дорівнює нулю (або не нулю).
Крім того, якщо вам важлива така велика оптимізація, ви можете піти ++i
замість цього i++
, тому що ++i
це одна команда процесора, тоді як i++
означає j=i+1, i=j
.]]
Дійсно швидкі петлі можна зробити, розгорнувши їх:
for(i=800000;i>0;--i)
do_it(i);
Це може бути набагато повільніше, ніж
for(i=800000;i>0;i-=8)
{
do_it(i); do_it(i-1); do_it(i-2); ... do_it(i-7);
}
але причини цього можуть бути досить складними (лише згадати, є проблеми попередньої обробки команд процесора та кеш-керування в грі).
Що стосується мов високого рівня , наприклад JavaScript, як ви запитували, ви можете оптимізувати речі, якщо покладатися на бібліотеки, вбудовані функції для циклічного циклу. Нехай вони вирішать, як це найкраще зробити.
Отже, у JavaScript я б запропонував використовувати щось подібне
array.forEach(function(i) {
do_it(i);
});
Він також менш схильний до помилок, і у браузерів є можливість оптимізувати ваш код.
[ЗАПОМОГА: не лише браузери, але і у вас є простор для оптимізації, просто переозначте forEach
функцію (браузер залежно), щоб вона використовувала останню кращу хитрість! :) @AMK каже, що в особливих випадках варто скористатися array.pop
або array.shift
. Якщо ви це зробите, покладіть його за завісу. Все можливе надмірністю є додавання опції forEach
для вибору алгоритму зациклення.]
Більше того, для мов низького рівня найкращою практикою є використання певної функції інтелектуальної бібліотеки для складних петельних операцій, якщо це можливо.
Ці бібліотеки також можуть розміщувати речі (багатопотокові) за вашою спиною, а також спеціалізовані програмісти постійно оновлюють їх.
Я трохи проаналізував, і виявилося, що в C / C ++, навіть для 5e9 = (50 000x100 000) операцій, немає різниці між підйомом і зменшенням, якщо тестування проводиться на константі, як говорить @alestanis. (Результати JsPerf іноді суперечливі, але за великим рахунком говорять те саме: ви не можете зробити велику різницю.)
Отож, --i
це трапляється досить "шикарною" річчю. Це лише робить вас схожим на кращого програміста. :)
З іншого боку, для того, щоб розгортатись у цій ситуації 5e9, це знизило мене з 12 до 2,5 сек, коли я пройшов 10 с, і до 2,1 сек, коли я пішов на 20 с. Це було без оптимізації, і оптимізація зводила речі до невимірного мало часу. :) (Розгортання може бути зроблено в моєму способі вище або за допомогою i++
, але це не випереджає справи в JavaScript.)
Загалом: зберігайте i--
/ i++
та ++i
/ i++
відмінності на співбесіді з роботою, дотримуйтесь array.forEach
чи інших складних функцій бібліотеки, коли вони доступні. ;)