Оптимизация глазка
Оптимизация глазка — это метод оптимизации, выполняемый на небольшом наборе инструкций, генерируемых компилятором , известных как глазок или окно. [ 1 ] это предполагает замену инструкций логически эквивалентным набором, имеющим лучшую производительность.
Например:
- Вместо того, чтобы помещать регистр в стек, а затем немедленно возвращать значение обратно в регистр, удалите обе инструкции.
- Вместо умножения x на 2 выполните
x + x
- Вместо умножения регистра с плавающей запятой на 8 прибавьте 3 к показателю степени регистра с плавающей запятой.
Термин «оптимизация глазка» был введен Уильямом Маршаллом Маккиманом в 1965 году. [ 2 ]
Замены
[ редактировать ]Замены оптимизации глазка включают, помимо прочего: [ 3 ]
- Нулевые последовательности – удаление ненужных операций.
- Объединение операций – замена нескольких операций одним эквивалентом.
- Алгебраические законы. Используйте алгебраические законы для упрощения или изменения порядка инструкций.
- Инструкции для особых случаев. Используйте инструкции, предназначенные для особых случаев операндов.
- Операции в режиме адреса. Используйте режимы адреса для упрощения кода.
Выполнение
[ редактировать ]Современные компиляторы часто реализуют оптимизацию «глазок» с помощью сопоставления с образцом алгоритма . [ 4 ]
Примеры
[ редактировать ]Замена медленных инструкций более быстрыми
[ редактировать ]Следующий байт-код Java :
aload 1 aload 1 mul
можно заменить следующим, которое выполняется быстрее:
aload 1 dup mul
Что касается большинства оптимизаций «глазка», то они основаны на относительной эффективности различных инструкций. В этом случае, dup
(который дублирует и перемещает вершину стека ) , как известно/считается более эффективным, чем aload
(который загружает локальную переменную и помещает ее в стек).
Удаление лишнего кода
[ редактировать ]Следующий исходный код :
a = b + c; d = a + e;
напрямую компилируется в:
MOV b, R0 ; Copy b to the register
ADD c, R0 ; Add c to the register, the register is now b+c
MOV R0, a ; Copy the register to a
MOV a, R0 ; Copy a to the register
ADD e, R0 ; Add e to the register, the register is now a+e [(b+c)+e]
MOV R0, d ; Copy the register to d
но может быть оптимизирован для:
MOV b, R0 ; Copy b to the register
ADD c, R0 ; Add c to the register, which is now b+c (a)
MOV R0, a ; Copy the register to a
ADD e, R0 ; Add e to the register, which is now b+c+e [(a)+e]
MOV R0, d ; Copy the register to d
Удаление избыточных инструкций стека
[ редактировать ]Если компилятор сохраняет регистры в стеке перед вызовом подпрограммы и восстанавливает их при возврате, последовательные вызовы подпрограмм могут иметь избыточные инструкции стека.
Предположим, что компилятор генерирует следующие инструкции Z80 для каждого вызова процедуры:
PUSH AF
PUSH BC
PUSH DE
PUSH HL
CALL _ADDR
POP HL
POP DE
POP BC
POP AF
Если бы было два последовательных вызова подпрограммы, они бы выглядели так:
PUSH AF
PUSH BC
PUSH DE
PUSH HL
CALL _ADDR1
POP HL
POP DE
POP BC
POP AF
PUSH AF
PUSH BC
PUSH DE
PUSH HL
CALL _ADDR2
POP HL
POP DE
POP BC
POP AF
Последовательность регистров POP, за которой следует PUSH для тех же регистров, обычно избыточна. В случаях, когда это избыточно, оптимизация глазка удалит эти инструкции. В данном примере это приведет к появлению в глазке еще одной резервной пары POP/PUSH, которая будет поочередно удалена. Предполагая, что подпрограмма _ADDR2 не зависит от предыдущих значений регистра, удаление всего избыточного кода в приведенном выше примере в конечном итоге оставит следующий код:
PUSH AF
PUSH BC
PUSH DE
PUSH HL
CALL _ADDR1
CALL _ADDR2
POP HL
POP DE
POP BC
POP AF
См. также
[ редактировать ]- Оптимизаторы объектного кода , обсуждение общей алгоритмической эффективности
- Capex Corporation - выпустила COBOL оптимизатор , один из первых оптимизаторов объектного кода мэйнфреймов для IBM Cobol.
- Супероптимизация
- Digital Research XLT86 — оптимизирующий компилятор сборки из исходного кода.
Ссылки
[ редактировать ]- ^ Мучник, Стивен Стэнли (15 августа 1997 г.). Расширенное проектирование и реализация компилятора . Академическая пресса / Морган Кауфманн . ISBN 978-1-55860-320-2 .
- ^ Маккиман, Уильям Маршалл (июль 1965 г.). «Оптимизация глазка» . Коммуникации АКМ . 8 (7): 443–444. дои : 10.1145/364995.365000 . S2CID 9529633 .
- ^ Фишер, Чарльз Н.; Сайтрон, Рон К.; ЛеБлан-младший, Ричард Дж. (2010). Создание компилятора (PDF) . Аддисон-Уэсли . ISBN 978-0-13-606705-4 . Архивировано из оригинала (PDF) 3 июля 2018 г. Проверено 2 июля 2018 г.
- ^ Ахо, Альфред Вайно ; Лам, Моника Син-Линг ; Сетхи, Рави ; Уллман, Джеффри Дэвид (2007). «Глава 8.9.2 Генерация кода путем разбиения входного дерева». Составители - принципы, методы и инструменты (PDF) (2-е изд.). Образование Пирсона . п. 540. Архивировано (PDF) из оригинала 10 июня 2018 г. Проверено 2 июля 2018 г.
Внешние ссылки
[ редактировать ]Словарное определение оптимизации глазка в Викисловаре