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


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

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

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

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

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

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