2015-03-13 2 views
-5

Например, я хочу напечатать векторный контент. Что будет выполняться быстрее, «традиционный для» цикла (1) или C++ 11 один (2)? Или нет разницы во времени? Любая информация приветствуется.Диапазон для цикла C++ 11 из стороны оптимизации

1)

for (int i=0;i<FooBar_vector.size();i++) 
    { 
      cout<<FooBar_vector[i]<<endl; 
    } 

2)

for (auto &val : FooBar_vector) 
    { 
      cout<< val <<endl; 
    } 
+2

Вы можете сравнить его и посмотреть ... Но, честно говоря, если вы компилируете с оптимизацией, они должны быть одинаковыми. Если бы была разница (которая меня удивила бы), я не думаю, что это было бы заметно, так как печатание текста и промывка потока потребуются в большинстве случаев, я ожидаю. – Cornstalks

+1

Стоит отметить, что вы можете изменить 'endl' на" \ n ". Затем после цикла вызовите 'cout.flush()' – inetknght

+1

I -1'ed этот вопрос, потому что «что быстрее ... X или Y» - вопрос, который в принципе никогда не будет задан на SO. То, что вы должны делать, это профилирование кода самостоятельно. –

ответ

1

Нет основополагающих причин, по которым цикл цикла, основанный на диапазоне, будет медленнее, чем ручной цикл. Код, который определен для цикла, основанного на диапазоне, является идентичным, является относительно оптимальным циклом.

В вашем случае каждая итерация цикла логически вызывает size(). Если в любой точке цикла компилятор не сможет доказать, что size() не может измениться в вашем цикле, компилятор должен фактически вызвать size() (что обычно включает в себя вычитание двух указателей) и проверить его. Это может стоить определенной производительности в вашем случае с ручным контуром.

В цикле for(:) это может стоить корректности, в том случае, если в векторе, закольцованном по кругу, есть его итератор начала или конца, или недействительный во время цикла, цикл продолжает цикл по старым итераторам, а неопределенное поведение может результат.

Таким образом, две петли не являются (в общем) эквивалентными.

В случаях, когда диапазон циклического изменения неизменен, цикл for(:) будет работать, или лучше, чем большинство обработанных вручную циклов, которые просто перебирают элементы, поскольку большинство обработанных вручную циклов не создают копию end() и сравнить с этой копией.

В этом конкретном случае накладные расходы IO (и в меньшей степени, форматирование) будут массивно перегружать любые накладные расходы цикла.

5

Простой ответ: использовать профайлер.

Лучший ответ: почему вы беспокоитесь о производительности? Используйте # 2, он более ясен и менее подвержен ошибкам/опечаткам.

Ответ: Накладные расходы на потоковое вещание, вероятно, намного перевешивают любые накладные расходы на цикл. Но посмотрите на легкий ответ.

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