Межпроцедурная оптимизация


Межпроцедурная оптимизация ( IPO ) — это набор методов компилятора , используемых в компьютерном программировании для повышения производительности в программах, содержащих множество часто используемых функций небольшой или средней длины. IPO отличается от других оптимизаций компилятора тем, что анализирует всю программу, а не одну функцию или блок кода.

IPO стремится уменьшить или устранить повторяющиеся вычисления и неэффективное использование памяти, а также упростить итерационные последовательности, такие как циклы. Если вызов другой подпрограммы происходит внутри цикла, анализ IPO может определить, что лучше всего встроить эту подпрограмму. Кроме того, IPO может переупорядочивать подпрограммы для лучшего распределения памяти и локальности .

IPO может также включать типичные оптимизации компилятора, применяемые на уровне всей программы, например устранение мертвого кода (DCE), которое удаляет код, который никогда не выполняется. IPO также пытается обеспечить лучшее использование констант. Современные компиляторы предлагают IPO в качестве опции во время компиляции. Фактический процесс IPO может происходить на любом этапе между удобочитаемым исходным кодом и созданием готовой исполняемой двоичной программы.

Для языков, которые компилируются на основе файла за файлом, эффективный IPO для единиц перевода (файлов модулей) требует знания «точек входа» программы, чтобы можно было выполнить оптимизацию всей программы ( WPO ). Во многих случаях это реализовано как этап оптимизации времени компоновки ( LTO ), потому что компоновщику видна вся программа.

Цель любой оптимизации скорости состоит в том, чтобы программа работала как можно быстрее; проблема в том, что компилятор не может правильно проанализировать программу и определить, что она будет делать, не говоря уже о том, что программист намеревался для нее сделать. Напротив, люди-программисты начинают с другой стороны, имея цель, и пытаются создать программу, которая ее достигнет, желательно, не затрачивая много времени на размышления в процессе.

По разным причинам, включая удобство чтения, программы часто разбивают на несколько процедур, обрабатывающих несколько общих случаев. Однако общность каждой процедуры может привести к напрасным усилиям в конкретных случаях. Межпроцедурная оптимизация представляет собой попытку сократить эти потери.