Студопедия — Некоторые приемы оптимизации программ
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Некоторые приемы оптимизации программ






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

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

При оптимизации программы необходимо выявить те фрагменты исходного текста, которые являются “основными потребителями” ресурса, а затем перепрограммировать эти фрагменты, решая задачу оптимизации.

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

I. Оптимизация, не зависящая от компилятора.

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

II. Инициализация объектов данных.

Во многих программах какую-то часть объектов данных необходимо инициализировать, то есть присваивать им начальные значения. Такое присваивание выполняется либо в самом начале программы, либо, например, в начале цикла. Правильная инициализация объектов данных позволяет сэкономить драгоценное процессорное время. Так, например, если речь идет об инициализации массивов, использование цикла, скорее всего, будет менее эффективным, чем объявление этого массива типизированной константой.

III. Программирование арифметических операций.

В том случае, когда значительная часть времени работы программы отводится арифметическим вычислениям, немалые резервы повышения скорости работы программы тратятся в правильном программировании арифметических (и логических) выражений. Важно понимать, что различные арифметические операции значительно различаются по быстродействию. Самыми быстрыми являются операции сложения и вычитания. Более медленным является умножение, затем идет деление. Относительно много времени тратится на обращение к подпрограммам. Быстродействие также зависит от типа операндов.

Программируя арифметические выражения, следует выбирать такую форму их записи, чтобы количество медленных операций было сведено к минимуму.

Рассмотрим пример. Пусть необходимо вычислить многочлен 4-й степени:

ax4 + bx3 + cx2 + cx + e

При условии, что вычисление степени производится перемножением основания определенное число раз, нетрудно найти, что в этом выражении содержится 10 умножений (“медленных” операций). Однако это же выражение можно записать в следующем виде:

(((ax + b) * x + c) * x + d) * x +e

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

IV. Циклы

Различается и время выполнения циклов. Время выполнения цикла со счетчиком и цикла постусловием при всех прочих равных условиях совпадает, цикл с предусловием выполняется несколько дольше (примерно на 20-30%).

При использовании вложенных циклов следует иметь в виду, что затраты процессорного времени на выполнение такой конструкции могут зависеть от порядка следования вложенных циклов. Так, например, вложенный цикл со счетчиком

 

for j:= 1 to 100000

for k:= 1 to 1000

a:= 1

next k

next j

выполняется примерно на 10 % дольше, чем цикл

for j:= i to 1000

for k:= 1 to 100000

a:= 1

next k

next j

 

На первый взгляд, и в первом и во втором случае 10 000 000 раз выполняется оператор присваивания, и затраты времени на это должны быть одинаковы в обоих случаях. Но это не так. Объясняется это тем, что инициализация цикла, то есть обработка процессором его заголовка с целью определения начального и конечного значения счетчика, а также шага приращения счетчика требует времени. В первом случае 1 раз инициализируется внешний цикл и 100 000 раз — внутренний, то есть всего выполняется 100 001 инициализаций. Вo втором случае, как нетрудно подсчитать, таких инициализаций оказывается тишь 1001.

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

При вычислении сумм часто используются циклы, содержащие одинаковые операции, относящиеся к каждому слагаемому. Это может быть, например, общий множитель:

 

Summ = 0

For i=1 to 1000

Summ = Summ + a * x[i]

Next i

 

Очевидно, что другая форма записи этого цикла оказывается более экономной:

 

Summ = 0

For i=1 to 1000

Summ = Summ +* x[i]

Next i

Summ = a * Summ

 

так как она содержит всего одно умножение при том же числе сложений, против 1000 умножений в первом случае.

V. Инвариантные фрагменты кода

Эта тема тесно связана с проблемой оптимального программирования циклов. Внутри цикла могут встречаться выражения, фрагменты которых никак не зависят от управляющей переменной цикла. Их называют инвариантными фрагментами кода. Современные компиляторы часто определяют наличие таких фрагментов и выполняют автоматическую оптимизацию. Такое возможно не всегда, и иногда производительность программы зависит целиком от того, как запрограммирован цикл

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


ЛИТЕРАТУРА

Базовая

1. Васильев А., Андреев А. VBA в Office 200. Учебный курс. СПб.: Питер, 2001. – 432с.

2. Подлин Ш. Освой самостоятельно программирование для Microsoft Excel 2000 за 24 часа. Пер с анг. Ус.пос. – М.: Издательский дом «Вильямс», 2000. – 304с.

3. Ананьев А.И., Федоров А.Ф. Самоучитель Visual Basic 6.0. – СПб.: БЧИ-Петербург, 2002. – 624с.

4. Немнюгин С.А. Turbo Pascal: практикум. – М., 2000.

5. Йенсен К., Вирт Н. Паскаль: руководство для пользователя. – М., 1989.

6. Фаронов В.В. Турбо Паскаль. – М., 1992.

 

Дополнительная

1. Информатика / под ред. Н.В.Макаровой. – М., 2000.

2. Информатика: базовый курс / под ред. С.В.Симонович. – СПб., 2001.

3. Савельев А.Я. Основы информатики. – М., 2001.

4. Могилев А.В., Пак Н.И., Хеннер Е.К. Информатика. – М., 2000.

 

Рекдактор Н.Е.Гладких

Темплан 2009 г., поз.25

Подписано в печать 15.02.09. Формат 60х84/16. Ризограф. Бумага писчая.
Уч.-изд.л.2,4. Тираж 150 экз. Заказ 91.

Редакционно-издательский центр
Ростовского государственного строительного университета
344022, Ростов-на-Дону, ул. Социалистическая, 162


[*] Буквы кириллицы и латинского алфавита одинаковые по написанию имеют различные машинные коды и воспринимаются компьютером как разные символы.







Дата добавления: 2015-08-12; просмотров: 394. Нарушение авторских прав; Мы поможем в написании вашей работы!



Шрифт зодчего Шрифт зодчего состоит из прописных (заглавных), строчных букв и цифр...

Картограммы и картодиаграммы Картограммы и картодиаграммы применяются для изображения географической характеристики изучаемых явлений...

Практические расчеты на срез и смятие При изучении темы обратите внимание на основные расчетные предпосылки и условности расчета...

Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

Условия приобретения статуса индивидуального предпринимателя. В соответствии с п. 1 ст. 23 ГК РФ гражданин вправе заниматься предпринимательской деятельностью без образования юридического лица с момента государственной регистрации в качестве индивидуального предпринимателя. Каковы же условия такой регистрации и...

Седалищно-прямокишечная ямка Седалищно-прямокишечная (анальная) ямка, fossa ischiorectalis (ischioanalis) – это парное углубление в области промежности, находящееся по бокам от конечного отдела прямой кишки и седалищных бугров, заполненное жировой клетчаткой, сосудами, нервами и...

Основные структурные физиотерапевтические подразделения Физиотерапевтическое подразделение является одним из структурных подразделений лечебно-профилактического учреждения, которое предназначено для оказания физиотерапевтической помощи...

Что такое пропорции? Это соотношение частей целого между собой. Что может являться частями в образе или в луке...

Растягивание костей и хрящей. Данные способы применимы в случае закрытых зон роста. Врачи-хирурги выяснили...

ФАКТОРЫ, ВЛИЯЮЩИЕ НА ИЗНОС ДЕТАЛЕЙ, И МЕТОДЫ СНИЖЕНИИ СКОРОСТИ ИЗНАШИВАНИЯ Кроме названных причин разрушений и износов, знание которых можно использовать в системе технического обслуживания и ремонта машин для повышения их долговечности, немаловажное значение имеют знания о причинах разрушения деталей в результате старения...

Studopedia.info - Студопедия - 2014-2024 год . (0.013 сек.) русская версия | украинская версия