Какой лучший способ написать петли? - PullRequest
1 голос
/ 01 апреля 2011

Я хотел бы знать, как лучше всего писать циклы?

Лучше ли Count Down_to_Zero Loop, чем Count_Up_Loops? И особенно в контексте встраиваемых систем, какой из них лучше выбрать ???

Ответы [ 4 ]

9 голосов
/ 01 апреля 2011

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

Другие процессоры имеют разные наборы команд, поэтому применяются другие правила.

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

Как всегда, если вам приходится беспокоиться об этих вещах, то вы используете не тот процессор и инструменты. Идея написания на языке более высокого уровня, чем на ассемблере, состоит в том, чтобы объяснить инженеру по техническому обслуживанию, как работает программное обеспечение. Если использование обратного отсчета интуитивно понятно, не используйте его независимо от (незначительных) потерь эффективности процессора.

3 голосов
/ 01 апреля 2011

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

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

Не размещайте в заголовке оператора for ничего, что не связано с управлением циклом.*

Когда дело доходит до эффективности, вы можете спокойно оставить это компилятору.

3 голосов
/ 01 апреля 2011

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

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

int c;
while ((c = fgetc(somefile)) != EOF)
    /* Do something */
2 голосов
/ 01 апреля 2011

Лучший способ написать цикл for:

for(i=0; i<N; i++)
  for(j=0; j<N; j++)
  {
    array[i][j] = ... ;
  }

Все остальное - «преждевременная оптимизация», то есть вещи, которые компилятор действительно должен уметь обрабатывать для вас.

Однако, если у вас тупой компилятор, может быть более эффективно считать от N до нуля, поскольку сравнение с нулем быстрее, чем сравнение со значением на большинстве процессоров.

Обратите внимание, что Nдолжно быть постоянным выражением, если это возможно.Исключите вызовы функций, такие как strlen () и т. Д. Из сравнения циклов.

++ Я также буду быстрее, если код может оказаться в компиляторе C ++, где стандарт C ++ гарантирует, что ++ i быстрее, чемi ++, потому что i ++ создает временную невидимую переменную.

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

...