Межпроцедурная оптимизация с использованием встроенной замены

Опубликовано: 6 Октября, 2022

Различные области оптимизации кода включают локальную оптимизацию, региональную оптимизацию, глобальную оптимизацию и межпроцедурную оптимизацию.

Локальная оптимизация относится к оптимизации в базовом блоке. Региональная оптимизация относится к оптимизации в расширенном базовом блоке. Глобальная оптимизация относится к оптимизации всей процедуры. Межпроцедурная оптимизация относится к оптимизации целых программ, включающих различные процедуры. Термин «межпроцедурный» означает между различными процедурами, тогда как термин «внутрипроцедурный» означает внутри одной процедуры. Глобальная оптимизация — это внутрипроцедурная оптимизация. Программа обычно делится на несколько процедур, чтобы упростить нашу работу по анализу, отладке и т. д. Но разделение программы на несколько процедур имеет свои преимущества и недостатки.

Преимущества и недостатки разделения программы на несколько процедур заключаются в следующем:

Преимущества :

  1. Он ограничивает объем кода, который компилятор рассматривает в любой конкретный момент времени.
  2. Это приводит к сохранению небольших структур данных времени компиляции и ограничению стоимости различных алгоритмов времени компиляции.

Недостатки:

  1. Это не позволяет компилятору понять, что происходит внутри вызова.
  2. Требует частых прыжков.

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

Межпроцедурная оптимизация может быть выполнена с использованием двух методов:

  1. Встроенная замена
  2. Размещение процедуры

Чтобы оптимизировать всю программу, компилятор должен иметь доступ к анализируемому и трансформируемому коду. Выполнение оптимизации всей программы также влияет на структуру компилятора.

Встроенная замена:

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

У него есть две подзадачи:

  1. Процедура принятия решения
  2. Фактическая трансформация

Процедура принятия решения:

Это включает в себя выбор сайтов вызова, которые должны быть встроены. Выбор сайтов вызова для встроенных — очень сложная задача. Он включает в себя множество анализов и размышлений. Компилятор должен учитывать характеристики вызывающего объекта, вызываемого объекта и сайта. Встраивание может привести к увеличению размера кода и размера пространства имен, а также увеличить потребность в регистрах. Решение, принятое в одном месте вызова, влияет на решение, принятое в других местах вызова.

Критерии принятия решения:

Критериями, которые учитываются при принятии решения, являются:

  • Размер вызываемого объекта: если размер вызываемого объекта сравнительно меньше размера кода связывания процедуры, который включает в себя предварительный вызов, пост-возврат, пролог и эпилог, то встраивание вызываемого объекта должно уменьшить размер кода. Это также должно гарантировать, что выполняется меньше операций.
  • Размер вызывающего объекта: чтобы сбалансировать увеличение времени компиляции и снижение эффективности оптимизации, компилятор может ограничить общий размер процедуры.
  • Динамический подсчет вызовов: встраивание часто выполняемого сайта вызова дает больше преимуществ, чем встраивание менее часто выполняемого сайта вызова.
  • Статическое количество вызовов: это означает количество различных сайтов, которые вызывают процедуру. Составители отмечают этот счет.
  • Количество параметров: они играют роль в определении стоимости привязки процедуры.
  • Фактические параметры с постоянными значениями: имеет значение, если постоянные значения передаются в качестве фактических параметров. Это помогает, позволяя постоянную операцию складывания.
  • Вызовы в процедуре. Отслеживание количества вызовов в процедуре помогает найти листья в графе вызовов, которые всегда подходят для встраивания.
  • Глубина вложенности циклов: сайты вызовов внутри циклов выполняются чаще, чем сайты вызовов вне цикла.
  • Доля времени выполнения: вычисляется из данных профиля. Это помогает предотвратить встраивание компилятором процедур, которые не могут существенно повлиять на производительность.

Фактическая трансформация:

Это включает в себя переписывание сайта вызова с телом вызываемого абонента. Компилятор переписывает сайт вызова с телом вызываемого. Компилятор также вносит изменения для моделирования эффектов привязки параметров.