Есть ли разница в производительности между for () и while ()? - PullRequest
20 голосов

Ответы [ 16 ]

1 голос
/ 12 мая 2009

продолжить ведет себя по-разному в для и , в то время как : в для , он изменяет счетчик, в , в то время как обычно это не

1 голос
/ 11 мая 2009

На Atmel ATMega while () быстрее, чем для (). Почему это объясняется в AVR035: эффективное кодирование C для AVR.

P.S. Оригинальная платформа не упоминалась в вопросе.

0 голосов
/ 13 мая 2009

Является ли while() быстрее / медленнее, чем for()? Давайте рассмотрим несколько вещей об оптимизации:

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

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

  • Как программисты, мы пишем много вызовов функций, некоторые потому, что мы хотим этого, некоторые потому, что мы ленивы, а некоторые потому, что компилятор вставляет их, не будучи очевидным.

  • В большинстве случаев это не имеет значения, потому что аппаратные средства такие быстрые, а наша работа настолько мала, что компьютер подобен гончей собаке, которая добывает себе еду и просит больше.

  • Иногда, однако, работа достаточно велика, чтобы производительность была проблемой.

  • Что нам тогда делать? Где большая отдача?

    • Как заставить компилятор сбрасывать несколько циклов и так далее?
    • Поиск вызовов функций, которые -реально- не нужно делать так много?
  • Компилятор не может сделать последнее. Только мы, программисты, можем.

  • Нам нужно научиться или научиться делать это. Это не приходит естественно. Мы врожденно склонны делать неправильные предположения, а затем делать ставки на них. Получение лучших алгоритмов - это начало, но только начало. Наши учителя должны учить этому, если действительно они знают как.

  • Профилировщики - это начало. Я делаю это.

Апокрифическая цитата Вилли Саттона на вопрос Почему вы грабите банки? :
Потому что там деньги.

Если вы хотите сохранить циклы, выясните, где они находятся.

0 голосов
/ 12 мая 2009

В некоторых случаях есть разница.

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

0 голосов
/ 11 мая 2009

Они такие же, как производительность. Я склонен использовать while при ожидании изменения состояния (например, при ожидании заполнения буфера) и for при обработке нескольких отдельных объектов (например, при просмотре каждого элемента в коллекции).

0 голосов
/ 11 мая 2009

Возможно только стиль кодирования.

  • если вы знаете количество итераций.
  • время, если вы не знаете количество итераций.
...