Я пытаюсь дать широкую картину с этим ответом.
Следующие мысли в скобках были моей верой, пока я только недавно не проверил проблему:
[[С точки зрения языков низкого уровня , таких как 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
(в зависимости от браузера), чтобы она использовала новейшие хитрости! :) @ A.M.K. говорит, что в особых случаях стоит использовать array.pop
или array.shift
. Если вы сделаете это, положите его за занавес. максимальное превышение заключается в добавлении опций к forEach
для выбора алгоритма зацикливания.]
Более того, также для языков низкого уровня рекомендуется использовать некоторую интеллектуальную библиотечную функцию для сложных, зацикленных операций, если это возможно.
Эти библиотеки также могут помещать вещи (многопоточные) за вашу спину, а также специализированные программисты поддерживают их актуальность.
Я провел более тщательную проверку, и оказалось, что в C / C ++,
даже для операций 5e9 = (50 000 x 100 000), нет никакой разницы между повышением и уменьшением , если тестирование выполняется с константой, как говорит @alestanis. (Результаты JsPerf иногда противоречивы, но по большому счету говорят одно и то же: большой разницы не бывает.)
Так что --i
оказывается довольно «шикарной» вещью. Это только делает вас похожим на лучшего программиста. :)
С другой стороны, для развёртывания в этой ситуации 5e9 это снизило меня с 12 секунд до 2,5 секунд, когда я шел на 10 секунд, и до 2,1 секунд, когда я шел на 20 секунд. Это было без оптимизации, а оптимизация привела к невообразимому небольшому времени. :) (Развертывание может быть сделано моим способом выше или с использованием i++
, но это не продвигает вещи в JavaScript.)
В целом: сохраняйте i--
/ i++
и ++i
/ i++
различия с собеседованиями при работе, придерживайтесь array.forEach
или других сложных библиотечных функций, если они доступны. ;)