Основные методы программной оптимизации
Оптимизация работы с памятью. Методы этой группы повышают эффективность кэширования, и организуют упреждающую предвыборку. К этому же классу следует отнести методы выравнивания (alignment) адресов меток и переменных. Включает оптимизацию по размеру. — Os флаг активирует все флаги оптимизации из — O2, в основном те, которые не увеличивают размер выходного файла. В дальнейшем выполняются… Читать ещё >
Основные методы программной оптимизации (реферат, курсовая, диплом, контрольная)
Методы автоматической оптимизации можно разделить на следующие классы:
- — Оптимизация, удаляющая «лишний» код. К этому классу относятся методы оптимизации, удаляющие недоступный код, удаление повторяющихся подвыражений (common sub-expression elimination, CSE). Сюда же относятся такие методы, как вычисление выражений, содержащих константы, на этапе компиляции (constant folding) и, иногда, встраивание функций.
- — Оптимизация, улучшающая машинный код на локальном уровне. К этому классу относятся методы оптимизации, уменьшающие число машинных команд, заменяющие короткие последовательности команд более эффективными командами и выполняющие перестановку инструкций с целью уменьшения времени ожидания (peephole optimization).
- — Оптимизация работы с памятью. Методы этой группы повышают эффективность кэширования, и организуют упреждающую предвыборку. К этому же классу следует отнести методы выравнивания (alignment) адресов меток и переменных.
- — Оптимизация ветвлений и циклов. В этот класс входят методы, удаляющие избыточные условия ветвлений и оптимизирующие операции перехода. К оптимизации циклов относятся методы, разворачивающие циклы, оптимизирующие счетчики и т. п.
- — Оптимизация вызова функций. Включает управление формированием стекового фрейма, передачу аргументов в регистрах, оптимизацию кода возврата из функции и встраивание функций (function inlining).
- — Интеллектуальная оптимизация. Включает такие методы, как перестановка блоков (block reordering) и исключение концевой рекурсии.
Все указанные выше типы оптимизации реализованы в компиляторе GCC.
Подробную информацию о флагах, используемых при оптимизации GCC можно получить после ввода команды man gcc.
Для gcc версий 3. x и выше существует только 5 уровней оптимизации: — O0 (без оптимизации), — O1, — O2 и — O3 (O3 — самый высокий уровень), а так же — Os.
— O0
Отключает оптимизацию. Только переменные, объявленные register, сохраняются в регистрах.
— O (-O1)
Включает оптимизацию. Пытается уменьшить размер кода и ускорить работу программы. Соответственно увеличивается время компиляции. При указании — O активируются следующие флаги:
- — fauto-inc-dec — fcprop-registers — fdce — fdefer-pop — fdelayed-branch — fdse — fguess-branch-probability — fif-conversion2 — fif-conver ?sion
- — finline-small-functions — fipa-pure-const — fipa-reference — fmerge-constants — fsplit-wide-types — ftree-builtin-call-dce
- — ftree-ccp — ftree-ch — ftree-copyrename — ftree-dce — ftree-dominator-opts — ftree-dse — ftree-fre — ftree-sra — ftree-ter
- — funit-at-a-time
На тех машинах, которые способны поддерживать отладку даже без указателя на стек функции, также включается опция — fomit-frame-pointer.
На других машинах могут быть включены и другие флаги.
— O2
Оптимизирует еще больше. GCC выполняет почти все поддерживаемые оптимизации, которые не включают уменьшение времени исполнения за счет увеличения длины кода. Компилятор не выполняет раскрутку циклов или подстановку функций, когда вы указываете — O2. По сравнению с — O, эта опция увеличивает как время компиляции, так и эффективность сгенерированного кода.
- — O2 включает все флаги оптимизации наследованные от — O. Также включает следующие флаги оптимизации:
- — fthread-jumps
- — falign-functions — falign-jumps — falign-loops — falign-labels — fcaller-saves — fcrossjumping — fcse-follow-jumps — fcse-skip-blocks
- — fdelete-null-pointer-checks — fexpensive-optimizations — fgcse — fgcse-lm — findirect-inlining — foptimize-sibling-calls — fpeephole2
- — fregmove — freorder-blocks — freorder-functions — frerun-cse-after-loop — fsched-interblock — fsched-spec — fschedule-insns — fsched? ule-insns2 — fstrict-aliasing — fstrict-overflow — ftree-switch-conversion — ftree-pre — ftree-vrp
- — O3
Оптимизирует еще немного. Включает все оптимизации — O2 и также включает флаги.
— finline-functions — funswitch-loops — fpredictive-commoning — fgcse-after-reload — ftree-vectorize.
Примечание: Как правило, это отрицательно сказывается на времени компиляции, а иногда и на производительности программ.
— Os
Включает оптимизацию по размеру. — Os флаг активирует все флаги оптимизации из — O2, в основном те, которые не увеличивают размер выходного файла. В дальнейшем выполняются оптимизации по уменьшению размера кода.
- — Os выключает следущие флаги оптимизации:
- — falign-functions — falign-jumps — falign-loops — falign-labels — freorder-blocks
- — freorder-blocks-and-partition — fprefetch-loop-arrays — ftree-vect-loop-version