"Филипп Н.Хислей. Генерация высококачественного кода для программ, написанных на СИ " - читать интересную книгу автора |РИСУНОК 1: Выделение общих подвыражений |
+-------------------------------+ |Исходный текст на Си BORLAND LATTICE | | Turbo C 1.5 MS-DOS C 3.2 | +-------------------------------+ |if((h3 + k3) " 0 || mov AX,h3 mov AX,h3 | | (h3 + k3) · 5) add AX,k3 add AX,k3 | | printf("Common\ jl @18 js L0187 | | subexpression\ mov AX,h3 cmp AX,5 | | elimination"); add AX,k3 jle L0193 | | cmp AX,5 L0187: | | jle @17 mov AX,01.0000 | | @18: push AX | | mov AX,offset s@ call printf | | push AX add SP,2 | | call printf L0193: | | mov SP,BP | | @17: | +-------------------------------+ |Многократные вхождения вычислений заменяются значением, | |которое является результатом единственного вхождения | |вычисления. Borland Turbo C вычисляет значение выделенного | |выражения h3+k3 дважды, тогда как LATTICE MS-DOS C и другие | |применяют выделение общих подвыражений и вычисляют | |выражение только один раз. | "Снижение мощности" подразумевает замещение операций, которые требуют большего времени выполнения, более быстрыми. Компилятор может применять снижение мощности несколькими способами. Например, применяя снижение мощности к сгенерированному коду, компилятор может подменять операции, которые умножают или делят целые числа на степени двойки, операциями сдвига. "Удаление недостижимого кода" - еще один метод оптимизации. Недостижимый код - это некоторая последовательность инструкций программы, которая недостижима ни по одному пути в программе. Он может образоваться как следствие предыдущих операций оптимизации, кода условной отладки, или частых изменений программы многими программистами. Следующие операторы - это вариант кода для проверки компилятора на выполнение этого метода оптимизации. #define DEBUG 0 if(DEBUG) printf("Debug Function\n"); Манифестные константы часто могут скрывать существование недостижимого кода, особенно если такой код определяется внутри включаемого файла-заголовка. "Удаление лишних присваиваний" включает нахождение промежутка жизни переменной и удаление присваиваний этой переменной, если эти присваивания не могут изменить логику программы. Этот метод освобождает ограниченные ресурсы, такие как пространство стека или машинные регистры. В следующей последовательности команд: a = 5; |
|
|