Оптимизация программ
Оптимиза́ция програ́мм, преобразование программ для ЭВМ, направленное на улучшение их рабочих характеристик, чаще всего времени выполнения, реже – объёма, энергии, потребной для выполнения.
Одно из требований, предъявляемых к оптимизации программ, – её корректность: преобразованная программа должна быть эквивалентна исходной по своим результатам. Другое требование состоит в том, чтобы оптимизация программы имела приемлемую алгоритмическую сложность при реализации на ЭВМ. В статических компиляторах при оптимизации отдельных процедур или всей программы обычно выбирают алгоритмы линейной сложности относительно размера программы, а для алгоритмов большей сложности ограничивают размеры участков программы, которые подвергаются оптимизации. При динамической компиляции сложность алгоритмов оптимизации балансируют с выигрышем, получаемым от оптимизации, поэтому алгоритмы большой сложности применяют только к участкам программы, выполнение которых занимает значительную долю времени.
По степени зависимости оптимизации от особенностей ЭВМ оптимизацию программ делят на машинно-зависимую и машинно-ориентированную. По размеру оптимизируемого участка программы различают локальные (в пределах базового блока), глобальные (в пределах процедуры), межпроцедурные и межмодульные оптимизации (всей программы целиком). В ходе выполнения оптимизации программ часто сначала определяют потенциальные оптимизационные преобразования с учётом их корректности и выгодности с использованием методов анализа программ, а далее выполняют сами преобразования.
Часто применяющимися оптимизациями являются следующие: уменьшение частот выполнения фрагментов программы («чистка» циклов, зон и рекурсивных областей); экономия избыточных и общих выражений; «чистка» программы за счёт удаления недоступных, неиспользуемых или не влияющих на результат фрагментов программы; раскрутка, изменение пространства итераций и другие преобразования циклов для выявления параллелизма программы и улучшения локальности данных; встраивание одних процедур программы в другие для уменьшения стоимости вызовов процедур и увеличения области глобальных оптимизаций; преобразование косвенных вызовов процедур в прямые (девиртуализация) и др.
Отдельным видом оптимизации программ является оптимизация с учётом профиля программы, при которой сначала программа запускается на репрезентативном наборе входных данных для определения наиболее часто и долго выполняющихся её участков, а затем осуществляется компиляция программы, при которой оптимизации найденных участков отдаётся приоритет, в том числе за счёт меньшей оптимизации остальных участков. В последнее время разрабатываются подходы, в которых оптимизации с учётом профиля программы подвергается вся программа целиком в двоичном виде, прежде всего для переупорядочивания участков двоичного кода с целью максимального увеличения локальности.