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

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

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

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

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

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

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

гораздо большего числа итераций, чем внутренний. С выполнением
любого цикла связаны накладные расходы: в начале цикла индекс
должен быть инициализирован, а при каждой итерации - увеличен
и проверен. Общее число итераций равно 100 для внешнего цикла
и 100 * 5 = 500 для внутреннего цикла, что дает в сумме 600
итераций. Просто поменяв местами внешний и внутренний циклы,
вы можете снизить число итераций внешнего цикла до 5, тогда
как число итераций внутреннего цикла останется тем же. В итоге
вместо 600 итераций будут выполнены только 505. Можно ожидать,
что перемена циклов местами приведет примерно к 16%-ому
улучшению: (600 - 505) / 600 = 16%. На самом деле результаты
таковы:
Язык
Время выполнения
кода до
оптимизации
Время выполнения
оптимизированного
кода
Экономия
времени
C++
4,75
3,19
33%
Java
5,39
3,56
34%
РНР
4,16
3,65
12%
Python
3,48
3,33
4%
Значительные различия в очередной раз доказывают, что по
поводу следствий оптимизации нельзя сказать ничего
определенного, не оценив их в конкретной среде.
Снижение стоимости операций
Под снижением стоимости (strength reduction) понимают замену
дорогой операции на более дешевую, например, умножения на
сложение. Иногда внутри цикла выполняется умножение индекса на
какие-то другие значения. Сложение обычно выполняется быстрее,
чем умножение, и, если вы можете вычислить то же число,
610
ЧАСТЬ V Усовершенствование кода
заменив умножение на прибавление значения при каждой итерации
цикла, это скорее всего приведет к ускорению выполнения кода.
Вот пример кода, основанного на умножении:
Пример умножения с использованием индекса цикла (Visual Basic)
For i = О to saleCount - 1
commission( i ) = (i + 1) * revenue * baseCommission *
discount Next
Этот код прост, но дорог. В то же время цикл можно переписать
так, чтобы при каждой итерации выполнялось более дешевое
сложение:
Пример замены умножения на сложение (Visual Basic)
incrementalCommission = revenue * baseCommission * discount
cumulativeCommission = incrementalCommission For i = 0 to
saleCount - 1
commission( i ) = cumulativeCommission
cumulativeCommission = cumulativeCommission +
incrementalCommission Next
Этот вид изменения похож на купон, предоставляющий скидку со
стоимости цикла. В первоначальном коде при каждой итерации
выполнялось умножение выражения revenue * baseCommission *
discount на счетчик цикла, увеличенный на единицу: сначала на
1, затем на 2, затем на 3 и т. д. В оптимизированном коде
значение выражения revenue * baseCommission * discount
присваивается переменной incrementalCommission. После этого
при каждой итерации цикла значение incrementalCommission
прибавляется к cumulativeCommission. При первой итерации оно
прибавляется один раз, при второй - два, при третьей - три и
т. д. Эффект тот же, что и при умножении incrementalCommission
на 1, на 2, на 3 и т. д., но оптимизированный вариант дешевле.
Чтобы этот вид оптимизации оказался возможным, первоначальное
умножение должно зависеть от индекса цикла. В данном примере
индекс цикла был единственной изменяющейся частью выражения,
поэтому мы и смогли сделать выражение более эффективным. Вот к
чему это привело:

Время
выполнения
Время выполнения
Экономия
Язык
кода до
оптимизации
оптимизированного
кода
времени
C++
4,33
3,80
12%
Visual
Basic
3,54
1,80
49%
Примечание: тестирование выполнено для saleCount = 20. Все
используемые в вычислении переменные были переменными с
плавающей запятой.
ГЛАВА 26 Методики оптимизации кода
611
26.3. Изменения типов данных
Изменение типов данных может быть эффективным способом
сокращения кода и повышения его быстродействия. Проектирование
структур данных в этой книге не рассматривается, но умеренные
изменения реализации отдельных типов данных также могут
повышать производительность. Ниже описано несколько способов
оптимизации типов данных.
Использование целых чисел вместо чисел с плавающей запятой
Сложение и умножение целых чисел, как правило, выполняются
быстрее, чем аналогичные операции над числами с плавающей
запятой. Например, циклы выполняются быстрее, если индекс
имеет целочисленный тип.
Ш Пример неэффективного цикла с индексом с плавающей запятой
(Visual Basic)
Dim х As Single For x = 0 to 99 a( x ) = 0 Next
Сравните этот код с аналогичным циклом, в котором явно
используется целочисленный индекс:
Пример эффективного цикла с целочисленным индексом (Visual
Basic)
Dim i As Integer For i = 0 to 99 a( i ) = 0 Next
Насколько выгоден этот вид оптимизации? Вот результаты
выполнения указанных фрагментов кода Visual Basic и
аналогичных циклов, написанных на C++ и РНР:
Язык
Время
выполнения
кода до
оптимизации
Время
выполнения
оптимизирова
нного
Эконом
ия
времен
и
Соотношени
е
быстродейс
твия
кода
C++
2,80
0,801
71%
3,5:1
РНР
5,01
4,65
7%
1:1
Visual
Basic
6,84
0,280
96%
25:1
Использование массивов с минимальным числом измерений
Предыдущая << 1 .. 293 294 295 296 297 298 < 299 > 300 301 302 303 304 305 .. 426 >> Следующая