Оптимизация программы с развертыванием цикла - PullRequest
2 голосов
/ 20 мая 2019

У меня возник вопрос о развертывании цикла в цикле for и о том, как его использовать в цикле for, если вы не знаете количество итераций до ввода пользователя.

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

for(int i=0; i < 50; i++){ // instead of i < 200
 doSomething();
 doSomething();
 doSomething();
 doSomething();
}

Мой вопрос относится к

for(i=0; i<n; i++){
  doSomething();
}

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

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

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Вы можете сделать это так:

int i = 0;
while (i<=n-4) {
    doSomething();
    doSomething();
    doSomething();
    doSomething();
    i += 4;
}
while (i<n) {
    doSomething();
    i++;
}

Возможно, вы захотите заменить второй цикл на 3 if с (поскольку тело цикла будет выполнено максимум три раза).

Обратите внимание, что оптимизирующие компиляторы обычно выполняют такого рода преобразования автоматически, поэтому вам не нужно (кроме случаев, когда они этого не делают: Почему цикл поиска целочисленных массивов в C ++ медленнее, чем в Java? ).

2 голосов
/ 20 мая 2019

где n задано пользователем, и поэтому я не знаю, как точно использовать развертывание цикла в такой ситуации

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

Однако, как указывает @MilesBudnek, все это микрооптимизации.Если экономия микросекунд на одну итерацию в этом конкретном цикле не является критической для вашего приложения, вам не следует ни приближаться к этому, ни делать что-либо вручную.

...