2017-02-20 10 views
2

Рассмотрим следующий фрагмент кода в C++ для печати Кулак 10 положительных целых чисел:зацикливается быстрее, чем обходе по одному

for (int i = 1; i<11;i++) 

{ 

    cout<< i ; 

} 

Будет ли это быстрее или медленнее, чем последовательно печати каждого целого числа по одному, как следовать:

x =1; 

cout<< x; 

x++; 

cout<< x; 

и так далее ..

есть ли причина, почему она должна быть быстрее или медленнее? Различается ли он от одного языка к другому?

+0

сравнить количество операций. Это тоже самое. – lukai

+4

Любая причина, по которой цикл должен быть быстрее? Да. Кэширование. – phonetagger

+0

@ lukai Я не думаю, что количество операций одинаково: в версии без цикла нет никакого сравнения. (Хотя такой подход практически бесполезен в реальной жизни) –

ответ

1

В цикле действительная инструкция уровня машины будет одинаковой и, следовательно, того же адреса. В явных инструкциях инструкции будут иметь разные адреса. Таким образом, возможно, что для циклов кеш инструкций процессора обеспечит повышение производительности, которое может не произойти в последнем случае.

Для действительно небольшого диапазона (10) разница, скорее всего, будет незначительной. Для значительной длины цикла он может проявляться более четко.

3

Этот вопрос похож на this one; Я скопировал выдержку из my answer to that question ниже ... (цифры разные, 11 против 50, анализ один и тот же)

То, что вы планируете делать, - это ручная форма разворачивания петли. Развертка Loop - это оптимизация, которую иногда используют компиляторы для уменьшения накладных расходов, связанных с циклом. Компиляторы могут делать это только в том случае, если число итераций цикла может быть известно во время компиляции (т. Е. Число итераций является константой, даже если константа включает вычисление на основе других констант). В некоторых случаях компилятор может определить, что стоит развернуть цикл, но часто он не разворачивает его полностью. Например, в вашем примере компилятор может определить, что было бы преимуществом скорости, чтобы развернуть цикл от 50 итераций до только 10 итераций с 5 копиями тела цикла. Переменная цикла все равно будет, но вместо 50 сравнения счетчика циклов теперь код должен выполнить только 10 раз. Это компромисс, потому что 5 копий тела цикла съедают в 5 раз больше места в кеше, а это означает, что загрузка этих дополнительных копий одних и тех же инструкций заставляет кеш выселить (выкинуть), что многие инструкции, которые уже находятся в кэш и который, возможно, захотел остаться в кеше. Кроме того, загрузка этих 4 дополнительных копий инструкций тела цикла из основной памяти занимает намного больше времени, чем просто захват уже загруженных инструкций из кеша в случае, когда цикл вообще не разворачивается.

В общем, часто бывает выгоднее использовать только одну копию тела петли и идти вперед и оставить логику цикла на месте. (1.e вообще не выполняйте разворот цикла.)

Смежные вопросы