Нет основополагающих причин, по которым цикл цикла, основанный на диапазоне, будет медленнее, чем ручной цикл. Код, который определен для цикла, основанного на диапазоне, является идентичным, является относительно оптимальным циклом.
В вашем случае каждая итерация цикла логически вызывает size()
. Если в любой точке цикла компилятор не сможет доказать, что size()
не может измениться в вашем цикле, компилятор должен фактически вызвать size()
(что обычно включает в себя вычитание двух указателей) и проверить его. Это может стоить определенной производительности в вашем случае с ручным контуром.
В цикле for(:)
это может стоить корректности, в том случае, если в векторе, закольцованном по кругу, есть его итератор начала или конца, или недействительный во время цикла, цикл продолжает цикл по старым итераторам, а неопределенное поведение может результат.
Таким образом, две петли не являются (в общем) эквивалентными.
В случаях, когда диапазон циклического изменения неизменен, цикл for(:)
будет работать, или лучше, чем большинство обработанных вручную циклов, которые просто перебирают элементы, поскольку большинство обработанных вручную циклов не создают копию end()
и сравнить с этой копией.
В этом конкретном случае накладные расходы IO (и в меньшей степени, форматирование) будут массивно перегружать любые накладные расходы цикла.
Вы можете сравнить его и посмотреть ... Но, честно говоря, если вы компилируете с оптимизацией, они должны быть одинаковыми. Если бы была разница (которая меня удивила бы), я не думаю, что это было бы заметно, так как печатание текста и промывка потока потребуются в большинстве случаев, я ожидаю. – Cornstalks
Стоит отметить, что вы можете изменить 'endl' на" \ n ". Затем после цикла вызовите 'cout.flush()' – inetknght
I -1'ed этот вопрос, потому что «что быстрее ... X или Y» - вопрос, который в принципе никогда не будет задан на SO. То, что вы должны делать, это профилирование кода самостоятельно. –