Эффективность и оптимизация программ
Исследование эффективности и технологичности программного обеспечения. Изучение современных способов экономии памяти в программе. Алгоритм уменьшения времени выполнения программной обработки данных. Рассмотрение основных правил оптимизации программ.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лекция |
Язык | русский |
Дата добавления | 02.04.2019 |
Размер файла | 20,9 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http: //www. allbest. ru/
Лекция
Эффективность и оптимизация программ
План
Эффективность и технологичность. Способы экономии памяти. Способы уменьшения времени выполнения
Правила оптимизации программ
1. Эффективность и технологичность. Способы экономии памяти. Способы уменьшения времени выполнения
Технологичность - качество проекта программного продукта, от которого зависят трудовые и материальные затраты на его реализацию и последующие модификации. Хороший проект сравнительно быстро и легко кодируется, тестируется, отлаживается и модифицируется.
Из опыта разработчиков программного обеспечения:
Технологичность программного обеспечения определяется проработанностью его моделей, уровнем независимости модулей, стилем программирования и степенью повторного использования кодов.
Чем лучше проработана модель разрабатываемого программного обеспечения, тем четче определены подзадачи и структуры данных, хранящие входную, промежуточную и выходную информацию, тем проще их проектирование и реализация и меньше вероятность ошибок, для исправления которого потребуется существенно изменять программу.
Чем выше независимость модулей, тем их легче понять, реализовывать, модифицировать, а также находить в них ошибки и исправлять их.
Стиль программирования, под которым понимают стиль оформления программ и их «структурность», также существенно влияет на читаемость программного кода и количество ошибок программирования. Кризис 60-х годов XX в. был вызван, в том числе, и стилем программирования, при котором программа напоминала клубок спутанных ниток или блюдо спагетти, и отсутствием языковых конструкций поддержки «структурного» стиля.
Увеличение степени повторного использования кодов предполагает как использование ранее разработанных библиотек подпрограмм или классов, так и унификацию кодов текущей разработки.
Высокая технологичность проекта особенно важна, если разрабатывается программный продукт, рассчитанный на многолетнее использование, или необходимо обеспечить повышенные требования к его качеству. программный обеспечение память алгоритм
Традиционно эффективными считают программы, требующие минимального времени выполнения и/или минимального объема оперативной памяти. Особые требования к эффективности программного обеспечения предъявляют при наличии ограничений (на время реакции системы, на объем оперативной памяти и т.п.). В случаях, когда обеспечение эффективности не требует серьезных временных и трудовых затрат, а также не приводит к существенному ухудшению технологических свойств, необходимо это требование иметь в виду.
Обеспечение эффективности - оптимизировать те фрагменты программы, которые существенно влияют на характеристику эффективности. Для уменьшения времени выполнения некоторой программы следует проанализировать циклические фрагменты с большим количеством повторений: экономия времени одной итерации цикла будет умножена на количество итераций.
Не следует забывать, что многие способы снижения временных затрат приводят к увеличению емкостных и, наоборот, уменьшение объема памяти может потребовать дополнительного времени на обработку.
Не следует увеличивать эффективность за счет снижения технологичности разрабатываемого программного обеспечения.
Частично проблему эффективности программ решают за программиста компиляторы. Средства оптимизации, используемые компиляторами, делят на две группы:
машинно-зависимые (выполняют оптимизацию кодов на уровне машинных команд: исключение лишних пересылок, использование более эффективных команд, и т.п.);
машинно-независимые (выполняют оптимизацию на уровне входного языка: вынесение вычислений константных (независящих от индекса цикла) выражений из циклов и т.п.).
Нельзя вмешаться в работу компилятора, но существует много возможностей оптимизации программы на уровне команд.
Способы экономии памяти. Следует обращать особое внимание на выделение памяти под данные структурных типов (массивов, записей, объектов и т.п.).
При ограничениях на использование памяти следует выбирать алгоритмы обработки, не требующие дублирования исходных данных структурных типов в процессе обработки. (пример: алгоритмы сортировки массивов (сортировка методом «пузырька»)).
Если в программе необходимы большие массивы, используемые ограниченное время, то их можно размещать в динамической памяти и удалять при завершении обработки.
Следует помнить, что при передаче структурных данных в программу «по значению» копии этих данных размещаются в стеке. Избежать копирования удается, если передавать данные «по ссылке», но как неизменяемые (описанные const). Тогда размещается в стеке только адрес данных.
Способы уменьшения времени выполнения.
При написании циклических участков программы необходимо:
выносить вычисление константных, т.е. не зависящих от параметров цикла, выражений из циклов;
избегать «длинных» операций умножения и деления, заменяя их сложением, вычитанием и сдвигами;
минимизировать преобразования типов в выражениях;
оптимизировать запись условных выражений - исключать лишние проверки;
исключать многократные обращения к элементам массивов по индексам (особенно многомерных, так как при вычислении адреса элемента используются операции умножения на значение индексов) - первый раз прочитав из памяти элемент массива, следует запомнить его в скалярной переменной и использовать в нужных местах;
избегать использование различных типов в выражении и т.п.
2. Правила оптимизации программ
Жертвуем памятью ради скорости
Расширение структур данных. Время выполнения определенных операций с данными может быть уменьшено, если структуру расширить добавлением дополнительной информации или изменить представление данных в этой структуре так, чтобы ускорить к ним доступ.
Вычислять результаты заранее и хранить их. Стоимость повторного вычисления дорогостоящей функции может быть уменьшена путем однократного ее вызова и сохранения результата. Последующие вызовы обрабатываются с помощью таблицы, а не самой функцией.
Кэширование. Данные, к которым чаще всего обращаешься, должны располагаться ближе всего.
Лень в вычислениях. Стратегия, при которой значения объектов вычисляются только по мере необходимости, позволяет избавиться от вычисления значений тех объектов, которые в действительности не нужны.
Жертвуем скоростью ради памяти
Упаковка. Способы уплотненного представления данных позволяют уменьшить затраты памяти за счет быстроты обращения к этим данным.
Интерпретаторы. Объем кода программы часто может быть уменьшен с помощью интерпретаторов, позволяющих компактно представить последовательности часто используемых операторов.
Циклы
Выносить код из циклов. Вместо того, чтобы выполнять некоторую операцию в теле цикла каждый раз при его проходе, лучше вызвать ее один раз вне цикла.
Совмещение проверок. Внутренний цикл должен содержать минимально возможное количество проверок, а лучше всего только одну. Программист должен стараться уменьшить количество условий завершения цикла их объединением.
Раскрытие цикла. Раскрытие цикла позволяет избавиться от затрат на изменение значения индексов, помогает избежать остановов конвейера, уменьшает количество ветвлений и увеличивает параллелизм на уровне инструкций.
Раскрытие циклов передачи. Если большая часть внутреннего цикла состоит в тривиальных операциях присваивания, их часто можно удалить из цикла, если перепланировать использование переменных. Чтобы исключить присваивание i=j, нужно в последующем коде ставить вместо переменной i переменную j.
Удаление безусловных переходов. В быстром цикле не должно быть безусловных переходов. Безусловный переход в конце цикла может быть удален путем «поворота» этого цикла таким образом, чтобы в конце его оказалось условное ветвление. Эта операция обычно выполняется оптимизирующими компиляторами.
Слияние циклов. Если два соседних цикла работают с одним и тем же набором элементов, то их тела следует объединить, чтобы осталась только одна управляющая конструкция (заголовок цикла).
Логические правила
Используйте алгебраическую эквивалентность. Дорогостоящую логическую операцию можно заменить на эквивалентную ей алгебраическую, которая будет вычисляться быстрее.
Сокращение монотонных функций. Если нужно проверить, превысила ли неубывающая монотонная функция нескольких переменных некоторый порог, значения оставшихся переменных после достижения порога учитывать уже не нужно.
Изменение порядка проверок. Логические проверки должны быть расположены так, чтобы более быстрые условия, которые чаще оказываются правильными, стояли перед более медленными условиями, которые реже оказываются правильными.
Предварительное вычисление логических функций.. Логическая функция на небольшом множестве исходных значений может быть заменена таблицей, представляющей это множество.
Удаление булевских переменных. Булевские переменные могут быть убраны из программы с помощью замены операции присваивания такой переменной некоторого значения оператором if…else, в котором одна ветвь относится к случаю, когда переменная истинна, а другая - к случаю, когда эта переменная оказывается ложной.
Составление процедур
Устранение иерархий функций. Время выполнения элементов набора функций, нерекурсивно вызывающих друг друга, может быть сокращено раскрытием этих функций и связыванием передаваемых переменных.
Учитывать частоту ситуаций. Функции должны правильно обрабатывать все возможные ситуации и быть наиболее эффективными в наиболее часто возникающих ситуациях.
Сопрограммы. Многопроходный алгоритм может быть переделан в однопроходный с помощью сопрограмм.
Трансформация рекурсивных функций. Время выполнения рекурсивных функций может быть уменьшено применением следующих трансформаций:
замена рекурсии итерацией, как в программах со списками и двоичными деревьями,
преобразование рекурсии в итерацию использованием явного стека (если функция содержит только один рекурсивный вызов себя самой, нет необходимости сохранять на стеке адрес возврата),
если в самом конце тела функции делается вызов этой же функции, его можно заменить на безусловный переход к началу функции. Это часто называется «удалением концевой рекурсии». Такое ветвление часто может быть преобразовано в цикл,
часто оказывается более эффективным решать небольшие подзадачи внешними процедурами, а не выполнять рекурсию до задачи размером 0 или 1.
Параллелизм. Программа должна быть написана так, чтобы максимальным образом использовать параллелизм аппаратуры, на которой она выполняется.
Составление выражений
Инициализация во время компиляции. Максимальное количество переменных следует инициализировать до запуска программы.
Использование алгебраической эквивалентности. Если вычисление выражения занимает слишком много времени, его следует заменить на более дешевый эквивалент.
Удаление одинаковых выражений. Если одно и то же выражение вычисляется дважды с одинаковыми значениями входящих в него переменных, следует сохранить результат первого вычисления и использовать его вместо того, чтобы вычислять второй раз.
Парное вычисление. Если два одинаковых выражения часто вычисляются подряд, их следует вынести во внешнюю функцию.
Использовать параллелизм на уровне слов. При вычислении дорогостоящих выражений использовать всю ширину полосы пропускания данных того компьютера, на котором работаете.
Размещено на Allbest.ru
...Подобные документы
Сравнение различных способов обхода данных. Заполнение массива для случайного обхода. Изучение понятия кэш-памяти, ее основных размеров и функций. Оптимальный и неоптимальный алгоритм умножения двух матриц с точки зрения порядка обхода данных в памяти.
презентация [94,7 K], добавлен 02.06.2013Определение понятия и сущности программного обеспечения. Рассмотрение основ интерпретируемых и компилируемых программ. Особенности несвободных, открытых, свободных, системных, прикладных и инструментальных программ; основные принципы их применения.
реферат [25,6 K], добавлен 06.11.2014Рассмотрение правил записи, способов ввода и вывода, использования функций обработки символьных данных в Pascal. Описание алгоритмизации и программирования файловых структур данных, проектирования структуры файла. Ознакомление с работой данных массива.
курсовая работа [336,2 K], добавлен 27.06.2015Общая характеристика задач фиксации времени выполнения программ: выполнение процессов реального времени, профилирование. Программируемый интервальный таймер как весьма сложная система. Анализ основных функций, возвращающих стандартное время Windows.
курсовая работа [82,7 K], добавлен 18.05.2014Изучение особенностей операционной системы, набора программ, контролирующих работу прикладных программ и системных приложений. Описания архитектуры и программного обеспечения современных операционных систем. Достоинства языка программирования Ассемблер.
презентация [1,3 M], добавлен 22.04.2014Изучение понятия архивации, сжатия файлов с целью экономии памяти и размещения сжатых данных в одном архивном файле. Описания программ, выполняющих сжатие и восстановление сжатых файлов в первоначальном виде. Основные преимущества программ-упаковщиков.
контрольная работа [534,7 K], добавлен 11.01.2015Системное, прикладное и инструментальное программное обеспечение. Наиболее распространённые пакеты прикладных программ. Назначение и структура системных программ. Заполнение таблицы и работа с итогами в Excel, фильтрация данных и построение диаграммы.
контрольная работа [1,6 M], добавлен 29.01.2014Характеристика методов нечеткого моделирования и изучение системы кластеризации в пакетах прикладных программ. Разработка и реализация алгоритма для оптимизации базы правил нечеткого классификатора с помощью генетического алгоритма аппроксимации функции.
дипломная работа [1,9 M], добавлен 21.06.2014Анализ работы параллельных вычислений на видеокарте GeForce GT 540M с использованием текстурной памяти. Рассмотрение специфических особенностей по адресации текстурной памяти. Изучение основ чтения и записи данных. Описание примеров данных программ.
лабораторная работа [3,1 M], добавлен 04.12.2014Исследование программ, позволяющих обработать результаты наземных и спутниковых наблюдений. Анализ создания цифровой модели местности в программе GeoniCS. Изучение интерфейсов, основных функций и возможностей программ для постобработки полевых измерений.
курсовая работа [4,3 M], добавлен 15.04.2012Понятие программного обеспечения; исследование достижений и перспектив развития информационных технологий и систем. Функциональная и структурная организация ЭВМ. Оценка эффективности программ, используемых в организации ООО "Крепость-Абакан", их анализ.
отчет по практике [76,8 K], добавлен 21.03.2013Характеристика категорий современных баз данных. Исследование особенностей централизованных и распределенных баз данных. Классификация систем управления базами данных по видам программ и применению. Управление буферами оперативной памяти и транзакциями.
курсовая работа [45,2 K], добавлен 10.03.2016Анализ программного обеспечения, ограничивающего вредоносную деятельность на ПК. Анализ возможностей встроенных программ и программ сторонних производителей, а также необходимых настроек операционной системы (ОС) в плане информационной безопасности.
курсовая работа [3,2 M], добавлен 02.01.2010Понятие и принципы разработки программного обеспечения компьютера. Классификация и разновидности программ, их функциональные особенности, структура и сферы практического применения. Текстовые и графические редакторы. Правовая охрана программ и данных.
презентация [701,1 K], добавлен 31.01.2014Защита компьютера от вредоносных программ. Принцип работы антивирусных программ: проверка файлов, загрузочных секторов дисков и оперативной памяти и поиск в них известных и новых вредоносных программ. Сигнатуры и их использование при работе с компьютером.
презентация [976,8 K], добавлен 21.05.2019Запросы клиента по области возможных запросов к серверу. Программа для прогнозирования поведения надежности программного обеспечения на основе метода Монте-Карло. Влияние количества программ-клиентов на поведение программной системы клиент-сервера.
контрольная работа [705,3 K], добавлен 03.12.2010Использование операционных систем. Контрольно-испытательные методы анализа безопасности программного обеспечения. Логико-аналитические методы контроля безопасности программ и оценка технологической безопасности программ на базе метода Нельсона.
контрольная работа [22,6 K], добавлен 04.06.2012Объем двухпортовой памяти, расположенной на кристалле, для хранения программ и данных в процессорах ADSP-2106x. Метод двойного доступа к памяти. Кэш-команды и конфликты при обращении к данным по шине памяти. Пространство памяти многопроцессорной системы.
реферат [28,1 K], добавлен 13.11.2009Способы деинсталляции программ. Очистка реестра и жесткого диска от следов удаленных программ. Деинсталляция программного обеспечения сервера. Деинсталляторы: Add-Remove Master, Assisted Uninstal, Ashampoo UnInstaller, Fresh System и StarForce Clean.
реферат [535,6 K], добавлен 06.04.2010Функционирование систем массового обслуживания с разными типами заявок. Построение математической модели. Постановка задачи оптимизации среднего времени ожидания. Решение задачи оптимизации и разработка программного кода для оптимизации системы.
курсовая работа [538,5 K], добавлен 11.08.2017