Оптимизация глазка - Peephole optimization
Оптимизация глазка является техника оптимизации выполняется на небольшом наборе инструкций, генерируемых компилятором; небольшой набор известен как глазок или окно.[1]
Оптимизация с помощью глазка включает в себя замену небольшого набора инструкций на эквивалентный набор, который имеет лучшую производительность.
Например, вместо того, чтобы помещать регистр A в стек, а затем немедленно выталкивать значение обратно в регистр A, оптимизация с помощью глазка удалит обе инструкции.
Вместо добавления A к A оптимизация с помощью глазка может выполнить арифметический сдвиг влево.
Вместо умножения регистра с плавающей запятой на 8, оптимизация с помощью глазка может масштабировать показатель степени регистра с плавающей запятой на 3.
Вместо умножения индекса на 4, добавления результата к базовому адресу для получения значения указателя и последующего разыменования указателя, оптимизация с помощью глазка может использовать режим аппаратной адресации, который достигает того же результата с помощью одной инструкции.
Период, термин оптимизация глазка был представлен Уильямом Маршаллом МакКиманом в 1965 году.[2]
Правила замены
Общие методы, применяемые при оптимизации глазка:[3]
- Нулевые последовательности - удаление ненужных операций.
- Объединить операции - замена нескольких операций одним эквивалентом.
- Алгебраические законы - используйте алгебраические законы, чтобы упростить или изменить порядок инструкций.
- Инструкции для особых случаев - Используйте инструкции, разработанные для особых случаев операндов.
- Операции в адресном режиме - используйте режимы адреса для упрощения кода.
Могут быть и другие виды оптимизации глазок.
Примеры
Замена медленных инструкций на более быстрые
Следующее Байт-код Java
... загрузить 1 загрузку 1мул ...
можно заменить на
... загрузить 1dupmul ...
Этот вид оптимизации, как и большинство оптимизаций с помощью глазка, делает определенные предположения об эффективности инструкций. Например, в этом случае предполагается, что обман
операция (которая дублирует и подталкивает верхнюю часть куча ) более эффективен, чем загрузить X
операция (которая загружает локальный Переменная идентифицирован как Икс
и помещает его в стек).
Удаление избыточного кода
Другой пример - устранение избыточных хранилищ нагрузки.
а = Ь + с; д = а + е;
просто реализуется как
MOV б, R0 ; Скопируйте б в реестрДОБАВИТЬ c, R0 ; Добавьте c в регистр, регистр теперь b + cMOV R0, а ; Скопируйте реестр вMOV а, R0 ; Скопируйте в реестрДОБАВИТЬ е, R0 ; Добавьте e в регистр, теперь регистр a + e [(b + c) + e]MOV R0, d ; Скопируйте реестр в d
но может быть оптимизирован для
MOV б, R0 ; Скопируйте б в реестрДОБАВИТЬ c, R0 ; Добавьте c в регистр, который теперь b + c (a)MOV R0, а ; Скопируйте реестр вДОБАВИТЬ е, R0 ; Добавьте e в регистр, который теперь равен b + c + e [(a) + e]MOV R0, d ; Скопируйте реестр в d
Удаление избыточных инструкций стека
Если компилятор сохраняет регистры в стеке перед вызовом подпрограммы и восстанавливает их при возврате, последовательные вызовы подпрограмм могут иметь избыточные инструкции стека.
Предположим, что компилятор генерирует следующее Z80 инструкции для каждого вызова процедуры:
ТОЛКАТЬ AF ТОЛКАТЬ до н.э ТОЛКАТЬ DE ТОЛКАТЬ HL ВЫЗОВ _ADDR Поп HL Поп DE Поп до н.э Поп AF
Если бы было два последовательных вызова подпрограмм, они бы выглядели так:
ТОЛКАТЬ AF ТОЛКАТЬ до н.э ТОЛКАТЬ DE ТОЛКАТЬ HL ВЫЗОВ _ADDR1 Поп HL Поп DE Поп до н.э Поп AF ТОЛКАТЬ AF ТОЛКАТЬ до н.э ТОЛКАТЬ DE ТОЛКАТЬ HL ВЫЗОВ _ADDR2 Поп HL Поп DE Поп до н.э Поп AF
Последовательность POP regs, за которой следует PUSH для тех же регистров, обычно избыточна. В случаях, когда это избыточно, оптимизация глазком удалит эти инструкции. В примере это приведет к тому, что в глазке появится еще одна избыточная пара POP / PUSH, и они будут удалены по очереди. Предполагая, что подпрограмма _ADDR2 не зависит от предыдущих значений регистров, удаляя все избыточный код в приведенном выше примере в конечном итоге останется следующий код:
ТОЛКАТЬ AF ТОЛКАТЬ до н.э ТОЛКАТЬ DE ТОЛКАТЬ HL ВЫЗОВ _ADDR1 ВЫЗОВ _ADDR2 Поп HL Поп DE Поп до н.э Поп AF
Выполнение
Современные компиляторы часто реализуют оптимизацию глазком с помощью сопоставление с образцом алгоритм.[4]
Смотрите также
- Оптимизаторы объектного кода, обсуждение в отношении общего алгоритмическая эффективность
- Capex Corporation - произвел КОБОЛ оптимизатор, ранний мэйнфрейм оптимизатор объектного кода за IBM Кобол
- Супероптимизация
- Цифровые исследования XLT86, оптимизирующий компилятор сборки исходного кода
Рекомендации
- ^ Мучник, Стивен Стэнли (1997-08-15). Расширенный дизайн и реализация компилятора. Академическая пресса / Морган Кауфманн. ISBN 978-1-55860-320-2.
- ^ МакКиман, Уильям Маршалл (июль 1965 г.). «Глазковая оптимизация». Коммуникации ACM. 8 (7): 443–444. Дои:10.1145/364995.365000.
- ^ Фишер, Чарльз Н .; Cytron, Ron K .; ЛеБлан-младший, Ричард Дж. (2010). Создание компилятора (PDF). Эддисон-Уэсли. ISBN 978-0-13-606705-4. Архивировано из оригинал (PDF) на 2018-07-03. Получено 2018-07-02.
- ^ Ахо, Альфред Вайно; Лам, Моника Син-Линг; Сетхи, Рави; Ульман, Джеффри Дэвид (2007). «Глава 8.9.2« Генерация кода мозаикой входного дерева ». Компиляторы - принципы, методы и инструменты (PDF) (2-е изд.). Pearson Education. п. 540. В архиве (PDF) с оригинала на 2018-06-10. Получено 2018-07-02.
внешняя ссылка
Словарное определение оптимизация глазка в Викисловарь