Перенос проверки условия в конец цикла

Циклы типа 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 такт). Вроде бы и немного, но если цикл окажется внутри другого цикла, то все эти лишние такты будут повторяться многократно. Кроме того, цикл с постусловием содержит на одну команду меньше.

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: