Без оптимизации компилятора первый цикл переходит к ассемблерному коду:
@@:
cmp ... ; or test ...
jz @f
...
jmp @b
В то время как второй цикл идет примерно так:
jmp bottom
@@:
...
bottom:
cmp ... ; or test ...
jz @b
Обычно прогнозируется выполнение условных переходов, поэтому первый метод потенциально может привести к большему количеству сбросов в конвейер / кэш инструкций.
Однако самое важное, что для первого цикла есть две ветви, доступные для каждой итерации цикла (2N
), тогда как во второй, каждая итерация цикла имеет только одну ветвь с фиксированными издержками первого безусловного прыжок (N+1
).
Для получения дополнительной информации об оптимизации цикла см. Стр. 88 этого руководства по оптимизации сборки .