Файл: Руководство по стилю программирования и конструированию по.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.11.2023
Просмотров: 877
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
590
ЧАСТЬ V Усовершенствование кода
Оценка должна быть точной
Оценка производительности должна быть точной. Измере- ние времени выполнения программы с помощью секундо- мера или путем подсчета «один слон, два слона, три слона»
точным не является. Используйте инструменты профилиро- вания или системный таймер и методы, регистрирующие истекшее время выполнения операций.
Используете ли вы инструмент, написанный другим программистом, или пишете для оценки производительности программы собственный код, убедитесь, что из- меряете время выполнения только того оптимизируемого кода. Опирайтесь на число тактов процессора, выделенных вашей программе, а не на время суток. Иначе при переключении системы с вашей программы на другую программу один из ваших методов будет оштрафован на время, выделенное другой программе. Кро- ме того, попытайтесь исключить влияние процесса оценки кода и запуска про- граммы на первоначальный и оптимизированный код.
25.5. Итерация
Обнаружив в коде узкое место и попробовав его устранить, вы удивитесь, насколько можно повысить производительность кода путем его оптимизации. Единственная методика редко приводит к десятикратному улучшению, но методики можно эф- фективно комбинировать, поэтому даже после обнаружения одного удачного вида оптимизации продолжайте пробовать другие виды.
Однажды я написал программную реализацию алгоритма Data Encryption Standard
(DES). Ну, на самом деле я писал ее не один раз, а около тридцати. При шифрова- нии по алгоритму DES цифровые данные кодируются так, что их нельзя расшиф- ровать без правильного пароля. Этот алгоритм шифрования так хитер, что иног- да кажется, что он сам зашифрован. Моя цель состояла в том, чтобы файл объе- мом 18 кб шифровался на IBM PC за 37 секунд. Первая реализация алгоритма вы- полнялась 21 минуту 40 секунд, так что мне предстояла долгая работа.
Хотя большинство отдельных видов оптимизации было незначительно, в сумме они привели к впечатляющим результатам. Никакие три или даже четыре вида оптимизации не позволили бы мне достичь цели, однако итоговая их комбина- ция оказалась эффективной. Мораль: если копать достаточно глубоко, можно до- биться подчас неожиданных результатов.
Оптимизация алгоритма DES — самая агрессивная оптими- зация, которую я когда-либо проделывал. В то же время я никогда не создавал более непонятного и трудного в сопро- вождении кода. Первоначальный алгоритм был сложен. Код,
получившийся в результате трансформаций высокоуровневого кода, оказался практически нечитаемым. После преобразования кода на ассемблер я получил один метод из 500 строк, на который боюсь даже смотреть. Это отношение между оп- тимизацией кода и его качеством справедливо почти всегда. Вот таблица, отра- жающая историю оптимизации:
Перекрестная ссылка Методи- ки, указанные в этой таблице,
обсуждаются в главе 26.
Перекрестная ссылка Об инст- рументах профилирования см.
подраздел «Оптимизация кода»
раздела 30.3.
1 ... 68 69 70 71 72 73 74 75 ... 104
ГЛАВА 25 Стратегии оптимизации кода
591
Вид оптимизации
Время выполнения
Улучшение
Первоначальная реализация
21:40
Преобразование битовых полей в массивы
7:30 65%
Развертывание самого внутреннего цикла
for
6:00 20%
Удаление перестановок
5:24 10%
Объединение двух переменных
5:06 5%
Использование логического тождества
4:30 12%
для объединения первых двух этапов алгоритма DES
Объединение областей памяти, используемых
3:36 20%
двумя переменными, для сокращения числа операций над данными во внутреннем цикле
Объединение областей памяти, используемых
3:09 13%
двумя переменными, для сокращения числа операций над данными во внешнем цикле
Развертывание всех циклов и использование
1:36 49%
литералов для индексации массива
Удаление вызовов методов и встраивание
0:45 53%
всего кода
Переписывание всего метода на ассемблере
0:22 51%
Итог
0:22 98%
Примечание: постепенный процесс оптимизации, описанный в этой таблице, не под- разумевает, что все виды оптимизации эффективны. Я мог бы указать массу других ви- дов, приводивших к удвоению времени выполнения. Минимум две трети видов оптими- зации, которые я попробовал, оказались неэффективными.
25.6. Подход к оптимизации кода: резюме
Рассматривая целесообразность оптимизации кода, придерживайтесь следующе- го алгоритма:
1. Напишите хороший и понятный код, поддающийся легкому изменению.
2. Если производительность вас не устраивает:
a. сохраните работоспособную версию кода, чтобы позднее вы могли вернуться к «последнему нормальному состоянию»;
b. оцените производительность системы с целью нахождения горячих точек;
c. узнайте, обусловлено ли плохое быстродействие неадекватным проектом, не- верными типами данных или неудачными алгоритмами и определите, умест- на ли оптимизация кода; если оптимизация кода неуместна, вернитесь к п. 1;
d. оптимизируйте узкое место, определенное на этапе (c);
e. оцените каждое улучшение по одному за раз;
f. если оптимизация не привела к улучшению кода, вернитесь к коду, сохра- ненному на этапе (a) (как правило, более чем в половине случаев попытки оптимизации будут приводить лишь к незначительному повышению про- изводительности или к ее снижению).
3. Повторите процесс, начиная с п. 2.
592
ЧАСТЬ V Усовершенствование кода
Дополнительные ресурсы
В этом разделе я указал работы, посвященные повышению производительности в общем. Книги, в которых обсуждаются специфические методики оптимизации кода, указаны в раз- деле «Дополнительные ресурсы» в конце главы 26.
Производительность
Smith, Connie U. and Lloyd G. Williams.
Performance Solutions:
A Practical Guide to Creating Responsive, Scalable Software. Boston,
MA: Addison-Wesley, 2002. В этой книге обсуждается создание высокопроизводительного ПО, предусматривающее обеспечение нужной произво- дительности на всех этапах разработки. В ней вы найдете много примеров и кон- кретных случаев, относящихся к программам нескольких типов, а также конкрет- ные рекомендации по повышению производительности Web-приложений. Особое внимание в книге уделяется масштабируемости программ.
Newcomer, Joseph M.
Optimization: Your Worst Enemy. May 2000,
www.flounder.com/optimization.htm. В этой статье, принадле- жащей перу опытного системного программиста, описыва- ются разные ловушки, в которые вы можете попасть, используя неэффективные стратегии оптимизации.
Алгоритмы и типы данных
Knuth, Donald.
The Art of Computer Programming, vol. 1, Fundamental Algorithms, 3d ed. Reading, MA: Addison-Wesley, 1997.
Knuth, Donald.
The Art of Computer Programming, vol. 2, Seminumerical Algorithms, 3d ed. Reading, MA: Addison-Wesley, 1997.
Knuth, Donald.
The Art of Computer Programming, vol. 3, Sorting and Searching, 2d ed.
Reading, MA: Addison-Wesley, 1998.
Это три первых тома серии, которая по первоначальному замыслу автора должна включить семь томов. В этих несколько пугающих книгах алгоритмы описываются не только на обычном языке, но и с использованием математической нотации,
или MIX — языка ассемблера для воображаемого компьютера MIX. Кнут подроб- нейшим образом описывает огромное число вопросов, и, если вы испытываете сильный интерес к конкретному алгоритму, лучшего ресурса вам не найти.
Sedgewick, Robert.
Algorithms in Java, Parts 1-4, 3d ed. Boston, MA: Addison-Wesley,
2002. В четырех частях этой книги исследуются лучшие методы решения широ- кого диапазона проблем. В число тем книги входят фундаментальные сведения,
сортировка, поиск, реализация абстрактных типов данных и более сложные во- просы. В книге Седжвика
Algorithms in Java, Part 5, 3d ed. (Sedgewick, 2003) обсуж- даются алгоритмы, основанные на графах. Книги
Algorithms in C++, Parts 1-4, 3d ed. (Sedgewick, 1998),
Algorithms in C++, Part 5, 3d ed. (Sedgewick, 2002), Algorithms
in C, Parts 1-4, 3d ed. (Sedgewick, 1997) и Algorithms in C, Part 5, 3d ed. (Sedgewick,
2001) организованы похожим образом. Седжвик имеет степень доктора филосо- фии и в свое время был учеником Кнута.
http://cc2e.com/2592
http://cc2e.com/2599
http://cc2e.com/2585
ГЛАВА 25 Стратегии оптимизации кода
593
Контрольный список: стратегии оптимизации кода
Производительность программы в общем
Рассмотрели ли вы возможность повышения производи- тельности посредством изменения требований к программе?
Рассмотрели ли вы возможность повышения производительности путем изменения проекта программы?
Рассмотрели ли вы возможность повышения производительности путем изменения проектов классов?
Рассмотрели ли вы возможность повышения производительности путем сокращения объема взаимодействия с ОС?
Рассмотрели ли вы возможность повышения производительности путем устранения операций ввода/вывода?
Рассмотрели ли вы возможность повышения производительности путем использования компилируемого языка вместо интерпретируемого?
Рассмотрели ли вы возможность повышения производительности путем видов оптимизации, поддерживаемых компилятором?
Рассмотрели ли вы возможность повышения производительности путем перехода на другое оборудование?
Рассматриваете ли вы оптимизацию кода только как последнее средство?
Подход к оптимизации кода
Убедились ли вы в полной корректности программы перед началом оптими- зации кода?
Нашли ли вы узкие места в коде перед началом его оптимизации?
Оцениваете ли вы результаты выполнения каждого вида оптимизации кода?
Отменяете ли вы изменения, которые не привели к ожидаемому улучшению?
Пробуете ли вы несколько способов оптимизации каждого узкого места, т. е.
используете ли вы итерацию?
Ключевые моменты
쐽
Производительность — всего лишь один из аспектов общего качества ПО, и,
как правило, не самый важный. Оптимизация кода — лишь один из способов повышения производительности ПО, и тоже обычно не самый важный. Быст- родействие программы и ее объем обычно в большей степени зависят не от эффективности кода, а от архитектуры программы, детального проектирова- ния выбора структур данных и алгоритмов.
쐽
Важнейшее условие максимизации быстродействия кода — его количествен- ная оценка. Она необходима для обнаружения областей, производительность которых действительно нуждается в повышении, а также для проверки того,
что в результате оптимизации производительность повысилась, а не пони- зилась.
http://cc2e.com/2506
594
ЧАСТЬ V Усовершенствование кода
쐽
Как правило, основная часть времени выполнения программы приходится на небольшую часть кода. Не выполнив оценку, вы не найдете этот код.
쐽
Достижение желаемого повышения производительности кода при помощи его оптимизации обычно требует нескольких итераций.
쐽
Во время первоначального кодирования нет лучше способа подготовки к по- вышению производительности программы, чем написание ясного и понятно- го кода, поддающегося легкому изменению.