Оптимизация программы с разворачиванием цикла

У меня возник вопрос относительно разворачивания цикла в цикле 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 задается пользователем, поэтому я не знаю, как точно использовать развертывание цикла в такой ситуации.

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


person Saul    schedule 20.05.2019    source источник
comment
Если вы не измерили разницу в производительности, вы должны позволить оптимизатору вашего компилятора позаботиться об этом за вас.   -  person Miles Budnek    schedule 20.05.2019
comment
Развертывание влияет на производительность только при отладке. В выпуске развертывание вручную может действительно замедлить работу. Компилятор лучше нас знает, как оптимизировать такой тривиальный штат.   -  person ALX23z    schedule 21.05.2019


Ответы (2)


Сделать это можно так:

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

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

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

person geza    schedule 20.05.2019

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

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

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

person Acorn    schedule 20.05.2019