Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Совершенный код. Мастер-класс - Макконнелл С.

Макконнелл С. Совершенный код. Мастер-класс — М.: Русская редакция, 2005. — 896 c.
ISBN: 5-469-00822-3
Скачать (прямая ссылка): soversheniykodmasterklass2005.djvu
Предыдущая << 1 .. 290 291 292 293 294 295 < 296 > 297 298 299 300 301 302 .. 426 >> Следующая

Определение этой таблицы кажется запутанным, но, если она
хорошо документирована, читать ее будет не труднее, чем код
сложной логической цепи. Кроме того, изменить таблицу будет
гораздо легче, чем более раннюю логику. Вот результаты
сравнения быстродействия обоих подходов:
Язык
Время
выполнения
кода до
оптимизации
Время
выполнения
оптимизирова
нного
кода
Эконом
ия
времен
и
Соотношени
е
быстродейс
твия
C++
5,04
3,39
33%
1,5:1
Visual
Basic
5,21
2,60
50%
2:1
Отложенные вычисления
Один из моих бывших соседей любил все откладывать на потом. В
оправдание своей лени он говорил, что многое из того, что люди
порываются сделать, делать просто не нужно. Если подождать
достаточно долго, утверждал он, неважные дела канут в Лету, и
он не будет тратить на них свое время.
Методика отложенных вычислений основана на принципе моего
соседа: программа делает что-то, только когда это
действительно нужно. Отложенное вычисление похоже на стратегию
решения задач "по требованию", при которой работа выполняется
максимально близко к тому месту, где нужны ее результаты.
Допустим, ваша программа работает с таблицей из 5000 значений,
полностью генерируя ее при запуске и затем обращайтесь к ней
по мере выполнения. Если программа использует только небольшую
часть элементов таблицы, возможно, есть смысл вычислять их по
мере надобности, а не все сразу. После вычисления элемента его
можно сохранить на будущее (это называется "кэшированием").
602
ЧАСТЬ V Усовершенствование кода
26.2. Циклы
Перекрести ссылка 0 циклах см. также главу 16.
Так как циклы выполняются многократно, горячие точки часто
следует искать именно внутри циклов. Методики, описываемые в
этом разделе, помогают ускорить выполнение циклов.
Размыкание цикла
Замыканием (switching) цикла называют принятие решения внутри
цикла при каждой его итерации. Если во время выполнения цикла
решение не изменяется, вы можете разомкнуть (unswitch) цикл,
приняв решение вне цикла. Обычно для этого нужно вывернуть
цикл наизнанку, т. е. поместить циклы в условный оператор, а
не условный оператор внутрь цикла. Вот пример цикла до
размыкания:
Пример замкнутого цикла (C++)
for (1=0; i < count; i++ ) { if ( sumType == SUMTYPE_NET ) {
netSum = netSum + amount[ i ];
}
else {
grossSum = grossSum + amount[ i ];
В этом фрагменте проверка if ( sumType == SUMTYPE NET)
выполняется при каждой итерации, хотя ее результат остается
постоянным. Вы можете ускорить выполнение этого кода,
переписав его так:
Jl|^ Пример разомкнутого цикла (C++)
if ( sumType == SUMTYPE.NET ) {
for ( i = 0; i < count; i++ ) { netSum = netSum + amount[ i ];
Примечание: Этот фрагмент нарушает несколько правил хорошего
программирования. Удобочитаемость и удобство сопровождения
кода обычно важнее его быстродействия или размера, но темой
этой главы является производительность, а для ее повышения
часто нужно поступиться другими целями. Как и в предыдущей
главе, здесь вы найдете примеры методик кодирования, которые в
других частях этой книги не рекомендуются.
else {
for ( i = 0; i < count; i++ ) {
grossSum = grossSum + amount[ i ];
ГЛАВА 26 Методики оптимизации кода 603
Размыкание этого цикла позволяет ускорить его выполнение
примерно на 20%:
Язык
Время
выполнения кода
до оптимизации
Время выполнения
оптимизированного
кода
Экономия
времени
C++
2,81
2,27
19%
Java
3,97
ЗД2
21%
Visual
Basic
2,78
2,77
<1%
Python
8,14
5,87
28%
К сожалению, после размыкания цикла вам придется сопровождать
оба цикла параллельно. Так, если переменную count потребуется
заменить на clientCount, нужно будет изменить два фрагмента,
что будет раздражать и вас, и всех других программистов,
которым придется работать с вашим кодом.
Этот пример также иллюстрирует главную проблему оптимизации
кода: результат любого отдельного вида оптимизации
непредсказуем. Размыкание цикла оказалось выгодным для трех
языков из четырех, но не для Visual Basic. В случае этой конк-
ретной версии Visual Basic размыкание цикла только затруднило
сопровождение кода, ничего не дав взамен. Урок очевиден: чтобы
с уверенностью говорить о результатах любого вида оптимизации,
вы должны их оценить. Никаких исключений.
Объединение циклов
Если два цикла работают с одним набором элементов, можно
выполнить их объединение (jamming). Выгода здесь объясняется
устранением затрат, связанных с выполнением дополнительного
цикла. Например, на объединение претендуют следующие циклы:
Пример отдельных циклов, которые можно объединить (Visual
Basic)
For i = 0 to employeeCount - 1 employeeName( i ) =
Next
For i = 0 to employeeCount - 1 employeeEarnings( i ) = 0 Next
Объединение циклов обычно требует, чтобы условия циклов были
одинаковы. В нашем примере оба цикла выполняются от 0 до
employeeCount - /, поэтому мы можем их объединить:
Пример объединенного цикла (Visual Basic)
For i = 0 to employeeCount - 1 employeeName( i ) = ""
Предыдущая << 1 .. 290 291 292 293 294 295 < 296 > 297 298 299 300 301 302 .. 426 >> Следующая