Бинарный оптимизатор принимает существующие выходные данные компилятора и создает файл лучшего исполнения с той же функциональностью.
Оптимизатор объектного кода , иногда также известный как оптимизатор пост-прохода или, для небольших участков кода, оптимизатор глазка , является частью программного компилятора . Он берет выходные данные этапа компиляции исходного языка — объектный код или двоичный файл — и пытается заменить идентифицируемые разделы кода замещающим кодом, который является более алгоритмически эффективным (обычно с более высокой скоростью).
Примеры
Самый ранний «Оптимизатор COBOL» был разработан Capex Corporation в середине 1970-х годов для COBOL . В данном случае этот тип оптимизатора зависел от знания «слабостей» стандартного компилятора IBM COBOL и фактически заменял (или исправлял ) разделы объектного кода более эффективным кодом. Код замены может заменить, например, линейный поиск по таблице бинарным поиском или иногда просто заменить относительно медленную инструкцию на заведомо более быструю, которая в остальном функционально эквивалентна в своем контексте. Этот метод теперь известен как снижение силы . Например, на оборудовании IBM/360CLI инструкция была, в зависимости от конкретной модели, от двух до пяти раз быстрее, чем CLCинструкция для однобайтового сравнения. [1] [2]
Преимущества
Основное преимущество повторной оптимизации существующих программ заключалось в том, что запас уже скомпилированных клиентских программ ( объектный код ) можно было улучшить практически мгновенно с минимальными усилиями, сократив ресурсы ЦП при фиксированных затратах (цене проприетарного программного обеспечения ). Недостаток заключался в том, что новые выпуски COBOL, например, требовали (взимали плату) за обслуживание оптимизатора для удовлетворения возможных изменений внутренних алгоритмов COBOL. Однако, поскольку новые выпуски компиляторов COBOL часто совпадали с обновлением оборудования , более быстрое оборудование обычно более чем компенсировало возврат прикладных программ к их предварительно оптимизированным версиям (до тех пор, пока не был выпущен поддерживающий оптимизатор).
Другие оптимизаторы
Некоторые двоичные оптимизаторы выполняют сжатие исполняемых файлов , которое уменьшает размер двоичных файлов с использованием общих методов сжатия данных , уменьшая требования к хранению, а также время передачи и загрузки, но не улучшая производительность во время выполнения. Фактическая консолидация дублирующихся библиотечных модулей также позволит снизить требования к памяти.
Некоторые двоичные оптимизаторы используют метрики времени выполнения ( профилирование ) для интроспективного улучшения производительности, используя методы, аналогичные JIT- компиляторам.
Недавние улучшения
Недавно разработанные «бинарные оптимизаторы» для различных платформ, некоторые из которых претендуют на новизну, но, тем не менее, по существу используют те же (или подобные) методы, описанные выше, включают:
BOLT: оптимизатор пост-ссылок, построенный на базе LLVM . Используя профилирование на основе выборки, BOLT повышает производительность реальных приложений даже для высокооптимизированных двоичных файлов, созданных с использованием как оптимизации с обратной связью , так и оптимизации времени соединения . Для компиляторов GCC и Clang BOLT ускоряет их двоичные файлы до 20,4% по сравнению с FDO и LTO и до 52,1%, если двоичные файлы собраны без FDO и LTO. [13]
^ «Архивная копия» (PDF) . Архивировано из оригинала (PDF) 11 июля 2010 г. Проверено 7 января 2010 г.{{cite web}}: CS1 maint: архивная копия в заголовке ( ссылка )
^ Эванс, Майкл (1 декабря 1982 г.). «Разработка программного обеспечения для среды Cobol». Коммуникации АКМ . 25 (12): 874–882. дои : 10.1145/358728.358732 . S2CID 17268690. Архивировано из оригинала 27 октября 2021 г. Проверено 27 октября 2021 г.
^ «Автоматический двоичный оптимизатор IBM для z/OS — обзор» . www.ibm.com . 2015. Архивировано из оригинала 18 октября 2020 г. Проверено 15 мая 2020 г.
^ «Автоматический двоичный оптимизатор IBM для пробной облачной службы z/OS» . оптимизатор.ibm.com . 2020. Архивировано из оригинала 19 января 2021 г. Проверено 27 октября 2021 г.
^ «Оптимизатор двоичного кода». Архивировано из оригинала 22 июля 2010 г. Проверено 7 января 2010 г.
^ Дустервальд, Э. (2005). «Проектирование и разработка динамического бинарного оптимизатора». Труды IEEE . 93 (2): 436–448. doi :10.1109/JPROC.2004.840302. S2CID 2217101.
^ Сюй, Чаохао; Ли, Цзяньхуэй; Бао, Дао; Ван, Юн; Хуан, Бо (13 июня 2007 г.). «Оптимизация памяти на основе метаданных в динамическом двоичном трансляторе». Материалы 3-й международной конференции по виртуальным средам исполнения - VEE '07 . Ассоциация вычислительной техники. стр. 148–157. дои : 10.1145/1254810.1254831. ISBN978-1-59593630-1. S2CID 15234434. Архивировано из оригинала 27 октября 2021 г. Проверено 27 октября 2021 г. - из цифровой библиотеки ACM.
^ «Архивная копия» (PDF) . Архивировано (PDF) из оригинала 19 апреля 2009 г. Проверено 7 января 2010 г.{{cite web}}: CS1 maint: архивная копия в заголовке ( ссылка )
^ Ким, Джинпё; Сюй, Вэй-Чунг; Ю, Пен-Чунг (2007). «COBRA: Адаптивная среда двоичной оптимизации времени выполнения для многопоточных приложений». 2007 Международная конференция по параллельной обработке (ICPP 2007) . п. 25. дои :10.1109/ICPP.2007.23. ISBN978-0-7695-2933-2. S2CID 15079211.
^ «Архивная копия» (PDF) . Архивировано из оригинала (PDF) 11 сентября 2010 г. Проверено 7 января 2010 г.{{cite web}}: CS1 maint: архивная копия в заголовке ( ссылка )
^ "Оптимизация программного обеспечения "SOLAR" во время компоновки и во время выполнения" . Архивировано из оригинала 14 февраля 2016 г.
^ «Обзор продукта Dynimize» . dynimize.com . Архивировано из оригинала 25 октября 2021 г. Проверено 26 апреля 2021 г.
^ Панченко, Максим; Аулер, Рафаэль; Нелл, Билл; Оттони, Гильерме (16 февраля 2019 г.). «BOLT: Практический двоичный оптимизатор для центров обработки данных и за его пределами». Международный симпозиум IEEE/ACM по генерации и оптимизации кода (CGO) 2019 . стр. 2–14. arXiv : 1807.06735 . дои : 10.1109/CGO.2019.8661201. ISBN978-1-7281-1436-1. S2CID 49869552.