Главная » Просмотр файлов » К. Касперски - Техника оптимизации программ, Эффективное использование памяти

К. Касперски - Техника оптимизации программ, Эффективное использование памяти (1127752), страница 80

Файл №1127752 К. Касперски - Техника оптимизации программ, Эффективное использование памяти (К. Касперски - Техника оптимизации программ, Эффективное использование памяти) 80 страницаК. Касперски - Техника оптимизации программ, Эффективное использование памяти (1127752) страница 802019-05-11СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 80)

4.!. Таблица 4.1. Поддержка основных методов оптимизации компиляторами М1сгозогт Изиаг С++, Вог1апгу С++ н ЯАТСОМ С+ '. Компилятор Действие М!сговой У1виа! С++ 6 Вот!апб С++ В УУАТСОМ С++ 10 Размножение констант Всегда размножает Никогда не раз- множает Всегда размножа- ет Свертка констант Всегда сворачивает Никогда не свора- чивает Всегда сворачи- вает Вычисляет Вычисляет Вычисление констант- ных выражений Вычисляет Свертка функций Никогда не свора- чивает Никогда не свора- чивает Никогда не свора- чивает Удаление неиспользуемых переменных Удаляет все неявно неиспользуемые переменные с от- слеживанием гене- тических связей Удаляет лишь явно неиспользуемые переменные.

Гене- тические связи не отслеживает Удаляет все неявно неиспользуемые переменные с отслеживанием генетических связей Удаление неиспользуемых присвоений Удаляет Удаляет Удаляет Удаление копий пере- менных Не удаляет Удаляет Удаляет огненным источником информации остается машинный код, сгенерирован- ный компилятором. Исследование ассемблерных листингов, плюс собственный опыт создания оптимизирующих С-компиляторов — вот что легло в основу данной главы.

Ни рекламная информация, ни слухи, собранные в программистских кулуа- рах, автором не использовались. Конечно, это не страхует от ошибок, упуще- ний и заблуждений, но, во всяком случае, значительно уменьшает их число. К сожалению, в рамках одной главы невозможно рассказать о том, хах ра- ботает оптимизатор и придется ограничиться перечислением пунктов: что именно он оптимизирует.

Таблица 4.1 (продолжение) Компилятор Действие М1сгово(т У(виа! С++ 6 Вог1апт( С++ б УУАТСОМ С++ 10 Не удаляет Удаляет Удаляет Не удаляет Не удаляет Не удаляет Частично Не выполняет Не выполняет Заменяет Заменяет Заменяет Заменяет Не заменяет Не заменяет Заменяет Заменяет Заменяет Заменяет Заменяет Заменяет Заменяет Заменяет Не заменяет Использует Использует Использует Не заменяет Не заменяет Не заменяет Не удаляет Не удаляет Удаляет Не удаляет Частично Не удаляет (Иашинная оптимизация Удаление лишних при- своений Удаление лишних вы- зовов функций Выполнение алгебраи- ческих упрощений Оптимизация подвыра- жений Замена деления сдвигом Замена деления умно- жением Замена оператора взя- тия остатка битовыми операциями Быстрое вычисление остатка Замена умножения сдвигом Замена умножения сложением Использование ЕЕА для быстрого сложения (умножения, вычитания) Замена условных пере- ходов арифметически- ми операциями Удаление лишних ус- ловий Удаление заведомо ложных условий Вычислят идентич- ные выражения (с учетом перегруппи- ровки) лишь раз Не поддерживает Частично оптими- зирует без учета перегруппировки Не поддерживает Вычислят иден- тичные выраже- ния (с учетом перегруппировки) лишь раз Не поддерживает 410 Глава 4 Таблица 4.1 (окончание! Компилятор Действие Балансирует Балансирует Не балансирует Создает Создает Частично Разворот циклов Не разворачивает Не разворачивает Слияние циклов Не сливает Выносит Заменяет Заменяет Заменяет Заменяет Не заменяет Не заменяет Удаление ветвлений из Удаляет цикла Не удаляет Не удаляет Учет частоты использо- Учитывает вания переменных при помещении их в регистр Учитывает Учитывает Передача аргументов в Нет регистрах по умолчанию Нет Да Количество регистров, 2 выделенных для передачи аргументов функции Да Да Адресация локальных Да переменных через ЕВР Нет Нет Да Нет Частично Да Нет Да Да Балансировка дерева сазе-переходов Создание таблицы пе- реходов Вынос инвариантного кода за пределы цикла Замена циклов с пре- дусловием на циклы с постусловием Замена возрастающих циклов на убывающие циклы Оптимизация инициа- лизации константных строк Удаление "мертвого" кода Оптимизация констант- ных условий М!сгово!т Ч!вца! С++ 6 Вот!апб С++ $ Не сливает Не выносит УУАТСОМ С++ 1О Не разворачива- ет Не сливает Выносит Машинная оптимизация Оптимизация константных выражений "Священные войны" вокруг констант и переменных ведутся уже давно.

Одни утверждают, что везде, где только можно, следует заменять переменные константами, другие же советуют поступать наоборот — использовать переменные вместо непосредственных значений. Давайте попробуем разобраться с этим вопросом. Операндом машинной инструкции может быть либо регистр, либо непосредственное значение. В свою очередь, каждый из них может содержать либо готовое значение, либо указатель на ячейку памяти, из которой это значение следует извлечь.

Причем, в силу архитектурных ограничений, только один из двух операндов инструкции может обращаться к памяти. Отсюда следует, что непосредственное присвоение одной переменной другой переменной — невозможно. Приходится сначала загружать содержимое одной переменной в регистр общего назначения, а затем "перебрасывать" его в другую переменную. Платой за такое решение становится увеличение размера кода и снижение его быстродействия, не говоря уже о том, что лля этой операции требуется один регистр, а регистры, как известно, нужно беречь, ибо на платформе 1пге! х86 их всего семь.

Замена переменной ее фактическим значением позволяет избавиться от промежуточной пересылки, увеличивая тем самым компактность кода. Однако если к данной переменной обращение происходит неоднократно— гораздо выгоднее поместить ее в регистр. В 32-разрядном режиме это сэкономит в среднем четыре байта на каждое обращение и увеличит скорость выполнения инструкции с двух тактов процессора до одного. Таким образом, оптимальнее всего использовать следующую стратегию: наиболее интенсивно используемые константные переменные помешать в регистры, и только если свободных регистров нет, заменять переменные их непосредственными значениями.

Замена переменных константными значениями (аразмножение» констант) На жаргоне разработчиков оптимизирующих компиляторов замена переменных их непосредственными значениями называется "размножением" констант. Понять суть этого приема поможет следующий пример; заь а=схббб; зг (Ь > а) Ь=а; Поскольку непосредственное сравнение (равно как и присвоение) двух переменных невозможно, переменную а предпочтительнее заменить ее нено- Г'лава 4 47г средственным значением (обратите внимание, что это попутно экономит одну операцию пересылки): 11 (Ь > Охббб~ Ь=Охббб; Размножать константы — дело не хитрое и это умеют делать практически все компиляторы, даже не имеющие титула "оптимизирующих".

Но лишь немногие из них делают это правильно. Как уже было показано выше, наиболее оптимальная стратегия сочетает в себе использование регистров с непосредственными значениями. Так вот, компиляторы М(сгобо(! Ч(бра! С++ и >ЧАТСОМ всегда, когда это возможно, заменяют переменные непосредственными значениями, не "подозревая" о том, что в некоторых случаях их целесообразнее помещать в регистры. Компилятор же Вот)апд С++ вообще не способен размножать константы. Вычисление значения переменных на стадии компиляции (асверткаа констант) "Сверткои" констант, вопреки логике и здравому смыслу, разработчики компиляторов называют процесс, аналогичный их "развертке", за тем исключением, что "свертка" охватывает весь ансамбль константных выражений, а не одну константную переменную в отдельности. Логично: если все члены выражения (подвыражения) — константные переменные, то и значение выражения — тоже константа.

Например; гпс а=схббб; 1пе Ь=сх777; 1пп с=Ь-а; рсгппгцгвх1п", см с=ааь: рсгпЬГП'ах1п", см Значение переменной с инвариантно относительно входных данных программы и его можно вычислить еще на этапе трансляции, удалив переменные а и ь и заменив с ее фактическим значением. В результате всех преобразований оптимизированный код программы будет вгяглядеть следующим образом: рсгппе Пгбххп", Ох111Ы рс1пхгц'Ъх',и", ОхОООЫ 4!Э Машинная оптимизация Не правда ли, здорово?! "Свертка" констант не только увеличивает компактность кода, не только избавляет от загрузки переменных из медленной оперативной памяти, не только экономит регистры, но и значительно повышает быстродействие программы, разгружая процессор от части вычислений.

Выигрыш в производительности особенно заметен на свертке операций деления, умножения, взятия остатка, не говоря уже об обработке вещественных значений. Компиляторы М!сгобо)г 'х!бра! С++ и %АТСОМ всегда выполняют свертку констант, а вот Вог!апд С++ этого делать не умеет. Вычисление значений функций на стадии компиляции ("свертках функций) Если все аргументы функции — константные значения, то теоретически возвращаемый ей результат можно вычислить еще на стадии компиляции. Рассмотрим следующий пример; Гппс была а, апх Ь) хепптп аеЬ) паап)) рххпхб и"Ъх~п", Гппс )Охббб, Ох777) ) ) Несмотря на его тривиальность, предварительно вычислить значение функции г е не сможет ни М!сгобой С++, ни Вот!апг! С++, ни %АТСОМ! Причина в том, что единицей трансляции практически всех современных компиляторов является функция.

Компилятор выполняет ее синтаксический анализ и генерирует целевой код, инвариантный по отношению к остальным функциям программы. Исключение составляют встраиваемые ()и-!те) функции, но это — тема отдельного разговора. Таким образом, ни один из трех используемых компиляторов на сквозную оптимизацию не способен и сворачивать функции не умеет. Оптимизация алгебраических выражений Удаление неиспользуемых переменных Довольно часто программист объявляет переменную, но никак не использует ее в программе.

Особенно актуальна эта проблема для языка С, не под- Глава 4 держивающего (в отличие от его старшего собрата С++) объявления переменных по месту использования. Чтобы не метаться между разными частями программы, опытные разработчики объявляют переменные загодя, с "запасом".

Характеристики

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6439
Авторов
на СтудИзбе
306
Средний доход
с одного платного файла
Обучение Подробнее