ТЕХНИКА ОПТИМИЗАЦИИ ПРОГРАММ

       

Удаление ветвлений


Ветвления внутри циклов всегда нежелательны, а на старших моделях микропроцессоров Intel – особенно (кстати, большинство Си компиляторов платформы CONVEX вообще отказываются компилировать программы с ветвлениями внутри циклов).

Уникальной особенностью компилятора Microsoft Visual C++ является его умение избавляться от некоторых типов внутрицикловых ветвлений. Алгоритм подобной оптимизации слишком сложен, чтобы быть описанным в рамках журнальной статьи, поэтому, просто рассмотрим пример кода до и после оптимизации, а любопытных отошлем к книгам "Техника дизассемблирования программ" и "Техника оптимизации программ" Криса Касперски.

Рассмотрим типичный цикл с условием в середине:

do

{

printf("1й оператор\n");

if (--a<0) break;

printf("2й оператор\n");

}while(1);

Компилятор Microsoft Visual C++ не долго думая транслирует его в цикл с постусловием, удаляя тем самым оператор break.

printf("1й оператор\n");

a--;

if

(a>=0)

{

a++;

do

{

printf("1й оператор\n");

printf("2й оператор\n");

} while(–-a<0);

       }

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

Заметим еще раз –из всех трех рассматриваемых компиляторов удалять внутрицикловые ветвления умеет один лишь Microsoft Visual C++ – ни Borland C++, ни WATCOM на это не способны.

__циклы которые никогда не выполняются



Содержание раздела