Этот вопрос похож на this one; Я скопировал выдержку из my answer to that question ниже ... (цифры разные, 11 против 50, анализ один и тот же)
То, что вы планируете делать, - это ручная форма разворачивания петли. Развертка Loop - это оптимизация, которую иногда используют компиляторы для уменьшения накладных расходов, связанных с циклом. Компиляторы могут делать это только в том случае, если число итераций цикла может быть известно во время компиляции (т. Е. Число итераций является константой, даже если константа включает вычисление на основе других констант). В некоторых случаях компилятор может определить, что стоит развернуть цикл, но часто он не разворачивает его полностью. Например, в вашем примере компилятор может определить, что было бы преимуществом скорости, чтобы развернуть цикл от 50 итераций до только 10 итераций с 5 копиями тела цикла. Переменная цикла все равно будет, но вместо 50 сравнения счетчика циклов теперь код должен выполнить только 10 раз. Это компромисс, потому что 5 копий тела цикла съедают в 5 раз больше места в кеше, а это означает, что загрузка этих дополнительных копий одних и тех же инструкций заставляет кеш выселить (выкинуть), что многие инструкции, которые уже находятся в кэш и который, возможно, захотел остаться в кеше. Кроме того, загрузка этих 4 дополнительных копий инструкций тела цикла из основной памяти занимает намного больше времени, чем просто захват уже загруженных инструкций из кеша в случае, когда цикл вообще не разворачивается.
В общем, часто бывает выгоднее использовать только одну копию тела петли и идти вперед и оставить логику цикла на месте. (1.e вообще не выполняйте разворот цикла.)
сравнить количество операций. Это тоже самое. – lukai
Любая причина, по которой цикл должен быть быстрее? Да. Кэширование. – phonetagger
@ lukai Я не думаю, что количество операций одинаково: в версии без цикла нет никакого сравнения. (Хотя такой подход практически бесполезен в реальной жизни) –