Оптимизация программного кода
Зарегистрируйся в два клика и получи неограниченный доступ к материалам,а также промокод на новый заказ в Автор24. Это бесплатно.
Оптимизация кода содержит набор различных методов, которые предназначены для преобразования кода с целью улучшения его характеристик и повышения эффективности [14].
Основные цели оптимизации программного кода:
сокращение объема программного кода;
сокращение объема используемой оперативной памяти;
ускорение работы ПС;
уменьшение числа операций ввода-вывода [15].
Главны требованием, предъявляемым к методу оптимизации является тот факт, что оптимизированное ПС должно предоставлять те же результаты и побочные эффекты на том же наборе входных данных, что и неоптимизированное ПС.
Однако, это требование может и не иметь особого значения роли, если достигаемые критерии за счет использования оптимизации могут быть сочтены более важными, чем последствия от изменения поведения ПС.
Оптимизация программного кода может проводиться, как и вручную, программистом, так и автоматизировано, при помощи специальных ПС. В случае автоматизированной оптимизации в роли оптимизатора может выступать как отдельное ПС, так и ПС, непосредственно встроенное в компилятор (оптимизирующий компилятор).
Кроме того, процессоры, существующие в настоящее время, способны самостоятельно оптимизировать порядок выполнения инструкций программного кода на техническом уровне.
Важно отметить, что оптимизация бывает двух видов - высокоуровневая и низкоуровневая оптимизацию.
Высокоуровневая оптимизация чаще всего проводится разработчиком ПС, который, в свою очередь, оперируя абстрактными сущностями (процедурами, функциями, классами и т.д.) и представляя себе общую модель решения задачи, может оптимизировать дизайн ПС. В этом случае оптимизацию на уровне элементарных структурных блоков исходного кода (циклов, ветвлений и так далее) относят к высокоуровневой оптимизации.
Низкоуровневая оптимизация производится на этапе превращения исходного кода в набор машинных команд. Чаще всего именно данный этап подвергается автоматизации [16].
Стоит отметить, что специалисты, программирующие на ассемблере, считают, что ни одна машина не способна превзойти в этом программиста.
В настоящее время можно выделить два основных вида оптимизирующих преобразований:
преобразования исходного ПС (в форме его внутреннего представления в компиляторе), которые напрямую не зависят от результирующего объектного языка;
преобразования результирующей объектной модели ПС.
Преобразования исходного ПС не зависит от архитектуры, на которой будет выполняться разработанное ПС. Обычно в основе данного лежит выполнение известных логических и математических преобразований, производимых над внутренним представлением ПС.
Второй вид преобразований зависит не только от свойств объектного языка, но и от архитектуры вычислительной системы, на которой будет выполняться результирующее ПС. Именно этот тип оптимизации способствует существенному повышению эффективности результирующего программного кода.
Отдельно стоит заметить, что методы преобразования ПС также зависят от исходного языка программирования и его типов синтаксических конструкций. Существующие методы оптимизации подходят для большинства типовых конструкций языков программирования вне зависимости от их вида.
Далее представлены типовые синтаксические конструкции, для которых может выполняться оптимизация:
вызовов процедур и функций;
логических выражений;
линейных участков программы;
других конструкций входного языка [17].
Линейный участок программы представляет собой последовательность операций, выполняемую по порядку, обладающую одним вход и одним выходом
Зарегистрируйся, чтобы продолжить изучение работы
. В большинстве случаев линейный участок включает в себя последовательность вычислений, которые состоят из арифметических операций и операторов присвоения значений переменным.
Для операций, составляющих линейный участок ПС, может использоваться несколько видов оптимизирующих преобразований.
1. Удаление бесполезных присваиваний, которое заключается в том, чтобы в случае выполнения операции присваивания значения некоторой произвольной переменной А с номером i, существующей в составе линейного участка ПС, а также операции присваивания значения той же самой переменной А с другим номером j. При этом ij и ни в одной операции между i и j не используется значение переменной А. В таком случае операция присваивания значения с номером i является бесполезной. Фактически бесполезная операция присваивания значения предоставляет переменной значение, которое не применяется нигде, поэтому в данном случае можно исключить данную операцию.
В общем случае, бесполезными могут оказаться не только операции присваивания, но и любые другие операции линейного участка, результат выполнения которых нигде не применим [18].
Например, во фрагменте программы
X := Y * Z;
A := Y + Z;
X := D * Z;
первая операция присваивания будет считаться бесполезной и может быть удалена без каких-либо последствий. Вместе с удалением операции присваивания также можно удалить и операцию умножения.
2. Исключение избыточных вычислений (лишних операций), которое заключается в поиске и удалении операций из программного кода, которые осуществляют повторную обработку одних и те же операндов [19]. То есть, операция линейного участка с порядковым номером i считается лишней, в том случае, когда существует такая же операция с порядковым номером j, при этом ji и никакой операнд, который обрабатывается данной операцией, не изменялся никакой операцией с порядковым номером между i и j.
Для устранения избыточных вычислений, производится:
свертка объектного кода - выполнение во время компиляции тех операций исходного программного кода, для которых значения операндов уже известны. Примером свертки является вычисление выражений, операндами которых являются константы. Например, выражение X:=2*Y*Z*3; может быть преобразовано к виду X:=6*Y*Z.
перестановка операций, которая заключается в изменении порядка следования операций, что способствует повышению эффективности программного кода, но не оказывает влияния на результат вычислений. Например, для операции умножения в выражении X:=2*Y*4*Z; можно переставить без изменения конечного результата и выполнить в порядке X:=(2*4)*(Y*Z), а выражение X:=(2*4)*(Y*Z) может быть преобразовано к виду X:=8*Y*Z.
арифметические преобразования представляют собой выполнение изменений в части порядка следования операций на основании известных логических и алгебраических тождеств. Например, для выражения X:=Y*Z+Y*A может быть применено выражение X:=Y*(Z+A). Конечный результат при останется без изменений, но программный код будет содержать на одну операцию умножения меньше. К арифметическим преобразованиям следует отнести и такие действия, как замена целочисленного умножения на константы, возведения в степень на умножение, а значения кратные 2 на выполнение операций сдвига. Во всех случаях можно отметить увеличение быстродействия программного кода заменой сложных операций на более простые.
3
50% курсовой работы недоступно для прочтения
Закажи написание курсовой работы по выбранной теме всего за пару кликов. Персональная работа в кратчайшее время!