Генерация высококачественного кода для программ, написанных на СИ | страница 7



Поскольку оптимизирующему компилятору известен промежуток жизни переменной, он не будет намеренно генерировать "лишние операции сохранения и загрузки" (регистров). Лишние операции сохранения удаляются посредством удаления излишних присваиваний; лишние операции загрузки опускаются с помощью усовершенствованного распределения переменных по регистрам. Имея текст:

>a = i + 2;

>b = a + 3;

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

>mov AX,i

>add AX,2

>mov a,AX

>mov AX,a

>add AX,3

>mov b,AX

тогда как оптимизирующий компилятор может использовать механизм размещения переменных в регистрах для удаления лишней четвертой инструкции (mov AX,a).

Время, проводимое в циклах, может считаться основной частью всего времени выполнения программы. Наиболее важным в оптимизации циклов является минимизация временных циклов микропроцессора, требуемых для одной итерации цикла. Количество инструкций, генерируемых для цикла, не так важно, как количество временных циклов, которое требуется для выполнения каждой инструкции. Простой цикл и код, сгенерированный для него четырьмя компиляторами, демонстрирует большое разнообразие в размере и качестве кода (см. рис. 2).

--------------------------------------------------------------¬

¦РИСУНОК 2: Простой цикл ¦

+-------------------------------------------------------------+

¦Исходный текст на Си BORLAND METAWARE ¦

¦ Turbo C 1.5 High C 1.4 ¦

¦(x) - врем. циклы (125) (87) ¦

+-------------------------------------------------------------+

¦k5 = 10000; mov j5,0 mov j5,0 ¦

¦j5 = 0; mov k5,10000 mov k5,10000 ¦

¦do { @10: L00e3: ¦

¦ k5 = k5 - 1; mov AX,k5 dec k5 ¦

¦ j5 = j5 + 1; dec AX inc j5 ¦

¦ i5 = (k5 * 3) / mov k5,AX mov AX,j5 ¦

¦ (j5 * constant5); mov AX,j5 mov SI,AX ¦

¦} while (k5 > 0); inc AX sal SI,2 ¦

¦ mov j5,AX add SI,AX ¦

¦ mov AX,k5 mov AX,k5 ¦

¦ imul AX,AX,3 mov DX,AX ¦