9.2.4. Разворачивание циклов

Для небольших циклов время выполнения проверки условия и перехода на на­чало цикла может оказаться значительным по сравнению с временем выполнения самого тела цикла. Более того, Pentium Pro/Pentium II всегда тратят по крайней мере один такт процессора на цикл, хотя его тело может выполняться даже быст­рее одного такта. С этим легко справиться, вообще не создавая цикл, а просто по­вторив его тело нужное число раз (разумеется, только в случае, если нам заранее известно это Для очень коротких циклов можно, например, удваивать

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

;   Цикл от 10 до -1.

mov       dx, 10 loop_start:

[тело цикла] dec dx jns loop_start

Уменьшить DX.

; Если DX не отрицательный ; продолжить цикл.

[тело цикла]

| Оптимизация

Совершенно естественно, что эти простые методики не перечисляют Все воз­можности оптимизации среднего уровня, более того, они не описывают и десятой доли всех ее возможностей. Умение оптимизировать программы нельзя сформу­лировать в виде набора простых алгоритмов - слишком много таких ситуаций, когда любой алгоритм оказывается неоптимальным. При решении задачи оптими­зации приходится постоянно что-то изменять. Именно потому, что оптимизация всегда занимает очень много времени, рекомендуется приступать к ней только после написания программы. Как и во многих других случаях, на любой стадии создания программы с оптимизацией нельзя торопиться, но и нельзя совсем за­бывать о ней.