Межпроцедурная оптимизация с использованием встроенной замены
Различные области оптимизации кода включают локальную оптимизацию, региональную оптимизацию, глобальную оптимизацию и межпроцедурную оптимизацию.
Локальная оптимизация относится к оптимизации в базовом блоке. Региональная оптимизация относится к оптимизации в расширенном базовом блоке. Глобальная оптимизация относится к оптимизации всей процедуры. Межпроцедурная оптимизация относится к оптимизации целых программ, включающих различные процедуры. Термин «межпроцедурный» означает между различными процедурами, тогда как термин «внутрипроцедурный» означает внутри одной процедуры. Глобальная оптимизация — это внутрипроцедурная оптимизация. Программа обычно делится на несколько процедур, чтобы упростить нашу работу по анализу, отладке и т. д. Но разделение программы на несколько процедур имеет свои преимущества и недостатки.
Преимущества и недостатки разделения программы на несколько процедур заключаются в следующем:
Преимущества :
- Он ограничивает объем кода, который компилятор рассматривает в любой конкретный момент времени.
- Это приводит к сохранению небольших структур данных времени компиляции и ограничению стоимости различных алгоритмов времени компиляции.
Недостатки:
- Это не позволяет компилятору понять, что происходит внутри вызова.
- Требует частых прыжков.
Каждый вызов включает в себя выполнение предварительного вызова и последовательности после возврата в вызывающей стороне, а также последовательности пролога и эпилога в вызываемой стороне. Эти операции требуют значительного количества времени для реализации. Он включает в себя переходы между последовательностями. Это составляет накладные расходы. Это влияет на знания времени компиляции и действия во время выполнения. Эти проблемы нельзя решить с помощью внутрипроцедурной оптимизации, поскольку она ограничена одной процедурой. Чтобы уменьшить неэффективность, связанную с отдельными процедурами, компилятор может анализировать и преобразовывать несколько процедур вместе. В этом помогает межпроцедурная оптимизация.
Межпроцедурная оптимизация может быть выполнена с использованием двух методов:
- Встроенная замена
- Размещение процедуры
Чтобы оптимизировать всю программу, компилятор должен иметь доступ к анализируемому и трансформируемому коду. Выполнение оптимизации всей программы также влияет на структуру компилятора.
Встроенная замена:
Есть несколько действий во время выполнения, которые являются частью накладных расходов при реализации вызова процедуры. Примерами являются передача управления от вызывающего объекта к вызываемому и наоборот, возврат значений от вызываемого объекта к вызывающему и т. д. Компилятор может повысить эффективность, заменив сайт вызова копией тела вызываемого объекта. Это известно как встроенная замена . Это помогает компилятору избежать большей части кода компоновки процедур. Это также приводит к изменению графа вызовов программы.
У него есть две подзадачи:
- Процедура принятия решения
- Фактическая трансформация
Процедура принятия решения:
Это включает в себя выбор сайтов вызова, которые должны быть встроены. Выбор сайтов вызова для встроенных — очень сложная задача. Он включает в себя множество анализов и размышлений. Компилятор должен учитывать характеристики вызывающего объекта, вызываемого объекта и сайта. Встраивание может привести к увеличению размера кода и размера пространства имен, а также увеличить потребность в регистрах. Решение, принятое в одном месте вызова, влияет на решение, принятое в других местах вызова.
Критерии принятия решения:
Критериями, которые учитываются при принятии решения, являются:
- Размер вызываемого объекта: если размер вызываемого объекта сравнительно меньше размера кода связывания процедуры, который включает в себя предварительный вызов, пост-возврат, пролог и эпилог, то встраивание вызываемого объекта должно уменьшить размер кода. Это также должно гарантировать, что выполняется меньше операций.
- Размер вызывающего объекта: чтобы сбалансировать увеличение времени компиляции и снижение эффективности оптимизации, компилятор может ограничить общий размер процедуры.
- Динамический подсчет вызовов: встраивание часто выполняемого сайта вызова дает больше преимуществ, чем встраивание менее часто выполняемого сайта вызова.
- Статическое количество вызовов: это означает количество различных сайтов, которые вызывают процедуру. Составители отмечают этот счет.
- Количество параметров: они играют роль в определении стоимости привязки процедуры.
- Фактические параметры с постоянными значениями: имеет значение, если постоянные значения передаются в качестве фактических параметров. Это помогает, позволяя постоянную операцию складывания.
- Вызовы в процедуре. Отслеживание количества вызовов в процедуре помогает найти листья в графе вызовов, которые всегда подходят для встраивания.
- Глубина вложенности циклов: сайты вызовов внутри циклов выполняются чаще, чем сайты вызовов вне цикла.
- Доля времени выполнения: вычисляется из данных профиля. Это помогает предотвратить встраивание компилятором процедур, которые не могут существенно повлиять на производительность.
Фактическая трансформация:
Это включает в себя переписывание сайта вызова с телом вызываемого абонента. Компилятор переписывает сайт вызова с телом вызываемого. Компилятор также вносит изменения для моделирования эффектов привязки параметров.