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

       

Вынесение инвариантного кода за пределы цикла


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

Рассмотрим следующий пример:

for(a=0;a<(b*2);a++)

printf("%x\n",a*(b/2));

Выражения (b*2) и (b/2) очевидно представляют собой инвариант, и оптимизированный код будет выглядеть так:

tmp_1=b*2;

tmp_2=b/2;

for(a=0;a<tmp_1;a++)

printf("%x\n",tmp_2+=tmp_2);

Это экономит одну операцию деления и две операции умножения на каждую итерацию, что очень и очень неплохо!

Компиляторы Microsoft Visual C++ и WATCOM успешно распознают инвариантный код и выносят его за пределы цикла, а вот Borland C++ увы, нет.



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