"Филипп Н.Хислей. Генерация высококачественного кода для программ, написанных на СИ " - читать интересную книгу автора

оптимизации кода компилятора Си, предназначенного для PC, - оценка скорости.
Тщательный анализ задачи и чистая программная реализация обеспечивают
прочную основу для любых последующих усовершенствований, которые могут быть
внесены оптимизирующим компилятором. Нельзя ожидать, что оптимизация кода
компенсирует программам плохо организованную структуру задачи или выбор
неподходящего алгоритма. Например, существующая технология оптимизации никак
не сможет автоматически подставить алгоритм быстрой сортировки вместо
записанного алгоритма пузырьковой сортировки, хотя, возможно, будет получена
программа, работающая быстрее. К тому же, программисты могут просто влиять
на некоторые способы оптимизации кода, такие как вычисление константных
выражений, вынесение инвариантов циклов и совмещение циклов.

Сфера применения оптимизации

Термин "оптимизирующий компилятор" применяется поставщиками
компиляторов в общем смысле, для обозначения компиляторов, которые
обеспечивают какой-либо уровень оптимизации - от простейшего до наиболее
сложного. Чтобы различать степень оптимизации, предоставляемую
компиляторами, необходимо более точное определение терминов. Методы
оптимизации кода могут применяться на разных уровнях синтаксических
конструкций. От самого первичного уровня до наиболее укрупненного, т.е. на
уровне оператора, блока, цикла, процедуры и программы. Чем выше уровень
оптимизации, тем больше возможности повышения общей эффективности
программного модуля. Однако затраты на применение большей степени
оптимизации могут значительно увеличить время компиляции.
Оператор - это первичная синтаксическая единица в программе.
Большинство компиляторов выполняют некоторую оптимизацию на этом уровне.
Блок - это последовательность операторов, для которой существуют
единственная точка входа и единственная точка выхода. Линейный вид блока
инструкций позволяет компилятору выполнять оптимизацию, основывающуюся на
промежутках жизни различных данных и выражений, используемых внутри блока.
Оптимизирующий компилятор выделяет операционную структуру программ путем
конструирования ориентированного потокового графа программ, в котором каждая
вершина представляет основной блок, а связи между вершинами представляют
потоки управления. Большинство компиляторов производят оптимизацию на уровне
блока.
Цикл содержит выполняемую многократно последовательность операторов.
Поскольку многие программы проводят в циклах большую часть времени своего
выполнения, оптимизация в этой области может дать существенное улучшение
характеристик исполнения программы. Являясь обычной для компиляторов на
больших компьютерах и миникомпьютерах, оптимизация на уровне цикла является
новой для компиляторов Си на PC.
Процедуры - это операторы, которые содержат целые подпрограммы или
функции. Оптимизация на этом уровне вообще не выполняется компиляторами для
PC.
Наиболее сложный уровень оптимизации, уровень программы, в настоящее
время рассматривается чисто теоретически и не включается ни одним доступным
на PС, миникомпьютерах, и больших компьютерах компилятором Си.
Производители, которые утверждают, что их компиляторы выполняют глобальную
оптимизацию, имеют в виду уровень процедур, но не программы.