Количество инструкций, которые вы пишете в исходном коде, строго не связано с количеством машинных команд, которые будет генерировать компилятор.
Большинство компиляторов умнее и в вашем втором примере, может генерировать код, как:
operation();
operation();
operation();
operation();
operation();
автоматически, потому что они обнаруживают, что цикл будет всегда повторять 5 раз.
Кроме того, если вы делаете профилирование-ориентированной оптимизации и компилятор видит, что петля имеет крошечное тело и очень высокое повторение рассчитывать он может раскатать его даже для общего числа итераций с кодом, как:
while (count >= 5) {
operation();
operation();
operation();
operation();
operation();
count -= 5;
}
while (count > 0) {
operation();
count--;
}
Это составит для большой count
s примерно одну пятую тестов по сравнению с наивной версией.
Если это стоит того или нет, это то, что может рассказать только профилирование.
Одна вещь, которую вы можете сделать, если вы уверены, что код должен быть выполнен по крайней мере один раз, чтобы написать
do {
operation();
} while (--count);
вместо
while (count--) {
operation();
}
вероятность того, что count==0
несколько раздражает для процессоров, потому что в коде, генерированном большинством компиляторов, требуется дополнительный JMP:
jmp test
loop:
...operation...
test:
...do the test...
jne loop
машинный код для do { ... } while
версии вместо просто
loop:
... opertion ...
... do the test...
jne loop
Это ничего не должно делать. Ваш компилятор уже разворачивает циклы, если он более эффективен. – ThiefMaster
Зачем вам это нужно? Это займет больше места в кэше команд, потребует большего расшифровки команд и в основном будет хуже. Если бы это было лучше, разве компилятор не преобразовал бы его для вас? (Если это не мусор, и в этом случае, почему вы его используете?) –