Циклы типа while или for, которые так часто применяются в языках высокого уровня, оказываются менее эффективными по сравнению с циклами типа until из-за того, что в них требуется лишняя команда перехода.
; for (i = start_i; i < n; i++) <тело цикла>
mov edi, start_i; Начальное значение счётчика
mov esi, n; Конечное значение счётчика
loop_start:
cmp edi, esi; Пока EDI < ESI – выполнять
je loop_end
<тело цикла>
inc edi
jmp loop_start
loop_end:
; i = start_i; do { <тело цикла> } while (i < n);
mov edi, start_i
mov esi, n
loop_start:
<тело цикла>
inc edi
cmp edi, esi
jb loop_start; Пока EDI < ESI – выполнять
Предположим, в цикле должен быть один шаг. Тогда в цикле с предусловием будет выполнено сравнение, тело цикла, безусловный переход к началу цикла, сравнение и переход за цикл. В цикле с постусловием будет выполнено тело цикла, сравнение и нереализованный переход. Таким образом, в цикле с предусловием выполняется одно лишнее сравнение и два реализованных перехода (2 * 3 такта = 6 тактов) вместо одного нереализованного (1 такт). Вроде бы и немного, но если цикл окажется внутри другого цикла, то все эти лишние такты будут повторяться многократно. Кроме того, цикл с постусловием содержит на одну команду меньше.
Конечно, цикл с постусловием всегда выполняется хотя бы один раз, и во многих случаях перед циклом приходится добавлять ещё одну проверку, но в любом случае даже небольшое уменьшение тела цикла всегда оказывается необходимой операцией.