Что такое findslide.org?

FindSlide.org - это сайт презентаций, докладов, шаблонов в формате PowerPoint.


Для правообладателей

Обратная связь

Email: Нажмите что бы посмотреть 

Яндекс.Метрика

Презентация на тему Объектные технологии конструирования ПО

Содержание

Оптимизация кода – это в первую очередь повышение быстродействия, а так же сокращение объема кода.В чем заключается оптимизация?Инструменты оптимизации кода:Рефакторинг;Использование стратегий оптимизации.Лекция ?. Вводная
Объектные технологии конструирования ПОЛекция №??.1 Логика?.2 Циклы?.3 Изменение типов данных?.4 Выражения?.5 Методы?.6 Оптимизация кода – это в первую очередь повышение быстродействия, а так же Пример (выражение): if ( 5 < х ) and ( x < Если ваш язык не поддерживает сокра- щенную оценку, избегайте операторов and и Пример, в котором цикл продолжает выполняться даже после получения ответа (C++):negativeInputFound = Измените цикл for на цикл while и проверяйте значение negativeInputFound вместе с Упорядочивайте тесты так, чтобы самый быстрый и чаще всего оказывающийся истинным тест Пример плохо упорядоченного логического теста (Visual Basic):Select inputCharacter 	Case Пример хорошо упорядоченного логического теста (Visual Basic): Select inputCharacter Case Лекция ?. ЛогикаУпорядочивание тестов по частоте Результаты оптимизации: Сравнения быстродействия похожих структур логикиТакой тип тестирование можно выполнить и для блоков Замена сложных выражений на обращене к таблице	Иногда просмотр таблицы может оказаться более Пример сложной логической цепи (C++):if ( ( а && ! с ) Пример использования таблицы вместо сложной логики (C++): static int categoryTable[ 2 ][ Отложенные вычисленияМетодика отложенных вычислений основана на принципе: “Программа делает что-то, только когда Размыкание цикла	Замыканием (switching) цикла называют при- нятие решения внутри цикла при каждой Пример замкнутого цикла (C++):for ( i = 0; i < count; i++ Объединение цикловЕсли два цикла работают с одним набором элемен- тов, можно выполнить Пример объединенного цикла (Visual Basic): For i = 0 to employeeCount - Пример однократного развертывания цикла (Java):i = 0;while ( i < count - Развертывание циклаЦелью развертывания (unrolling) цикла является сокращение затрат, связанных с его выполнением. Минимизация объема работы, выполняемой внутри циклаОдной из методик повышения эффективности циклов является Пример цикла, включающего сложное выражение с указателями (C++):for ( i = 0; Сигнальные значенияЕсли цикл включает проверку слож- ного условия, время его выполнения часто Пример проверки сложного условия цикла (С#):found = FALSE;i = 0;//Проверка сложного условия.while Пример использования сигнального значения для ускорения цикла (С#):// Установка сигнального значения с Вложение более ресурсоемкого цикла в менее ресурсоемкийЕсли вы имеете дело с вложенными Пример вложенного цикла, который можно улучшить (Java):for ( column = 0; column Снижение стоимости оператораПод снижением стоимости (strength reduction) понимают замену дорогой операции на Пример умножения с использованием индекса цикла (Visual Basic):For i = 0 to Использование целых чисел вместо чисел с плавающей точкой	Сложение и умножение целых чисел, Использование массивов с минимальным числом измеренийИспользовать массивы, имеющие несколько измерений, накладно.Лекция ?. Пример стандартной инициализации двумерного массива (Java):for ( row = 0; row < Минимизация числа обращений к массивамКроме минимизации числа обращений к двумерным или трехмерным Пример вынесения обращения к массиву за пределы цикла (C++):for ( discountType = Использование дополнительных индексовИспользование дополнительного индекса предпола- гает добавление данных, связанных с основным Иногда выгоднее работать с индексом типа данных, а не с самим типом Кэширование – это такой способ хранения нескольких значений, при котором значения, используемые Алгебраические тождества иногда позволяют заме- нить дорогие операции на более дешевые.Пример: not Пример кэширования для предотвращения дорогих вычислений (Java):private double cachedHypotenuse = 0; private замена умножения сложением;замена возведения в степень умножением;замена тригонометрических функций их эквивалентами;замена типа Пример вычисления многочлена (Visual Basic):value = coefficient(0) For power = 1 To Инициализация во время компиляции	Если вы вызываете метод, передавая ему в ка- честве Недостатки системных методов	Системные методы дороги и часто обеспечивают избыточную точность. Если не Пример метода, вычисляющего двоичный логарифм с использованием системного метода и константы (C++):const Пример метода, определяющего примерное значение двоичного логарифма с использованием оператора сдвига вправо Использование констант корректного типаИспользуйте именованные константы и литералы, имеющие тот же тип, Предварительное вычисление результатовПри низкоуровневом проектировании часто приходится решать, вычислять ли результаты по Пример сложного выражения, которое можно вычислить предварительно (Java):double ComputePayment( long loanAmount, int Пример предварительного вычисления сложного выражения (Java):double ComputePayment( long loanAmount, int months, double вычисление результатов до выполнения программы и связывание их с констан- тами во однократное вычисление результатов при запуске программы и их использование во всех последующих Устранение часто используемых подвыражений	Если какое-то выражение повторяется в коде несколько раз, присвойте Одним из самых эффективных способов оптимизации кода является грамотная декомпозиция программы на В некоторых случаях можно сэкономить несколько нано секунд, встроив код метода в Переписывание кода на низкоуровневом языке1. Напишите все приложение на высокоуровневом языке.2. Выполните Оптимизация кода подразумевает на- хождение компромисса между слож- ностью, удобочитаемостью, простотой и Но если оптимизация не оправдывает проведе- ния профилирования, она не может оправдать Результаты конкретных видов оптимизации во многом за- висят от языка, компилятора и Ссылки Спасибо за внимание!
Слайды презентации

Слайд 2 Оптимизация кода – это в первую очередь повышение

Оптимизация кода – это в первую очередь повышение быстродействия, а так

быстродействия, а так же сокращение объема кода.
В чем заключается

оптимизация?

Инструменты оптимизации кода:
Рефакторинг;
Использование стратегий оптимизации.

Лекция ?. Вводная


Слайд 3 Пример (выражение): if ( 5 < х )

Пример (выражение): if ( 5 < х ) and ( x

and ( x < 10 ) then …
Как только

вы определили, что х больше 5, вторую часть проверки выполнять не нужно.

Некоторые языки поддерживают "сокращенную оценку выражений", при которой компилятор генери- рует код, автоматически прекращающий проверку после получения ответа.

Сокращенная оценка выполняется, например, для стандартных операторов C++ и "условных" операторов Java.

Лекция ?. Логика

Прекращение проверки сразу после получения ответа


Слайд 4 Если ваш язык не поддерживает сокра- щенную оценку,

Если ваш язык не поддерживает сокра- щенную оценку, избегайте операторов and

избегайте операторов and и or, используя вместо них дополнительную

логику.

Пример сокращенной оценки:
if ( 5 < х ) then
if ( х < 10 ) then …

Лекция ?. Логика

Прекращение проверки сразу после получения ответа


Слайд 5 Пример, в котором цикл продолжает выполняться даже после

Пример, в котором цикл продолжает выполняться даже после получения ответа (C++):negativeInputFound

получения ответа (C++):
negativeInputFound = false;
for ( i =

0; i < count; i++ ) {
if ( input[ i ] < 0 ) {
negativelnputFound = true;
}
}

Оптимизация:
Включите в код оператор break после строки negativeInputFound = true.
Если язык не поддерживает оператор break, имитируйте его при помощи оператора goto, передающего управ- ление первой команде, расположенной после цикла.

Лекция ?. Логика

Прекращение проверки сразу после получения ответа


Слайд 6 Измените цикл for на цикл while и проверяйте

Измените цикл for на цикл while и проверяйте значение negativeInputFound вместе

значение negativeInputFound вместе с проверкой того, не превысил ли

счетчик цикла значение count.
Измените цикл for на цикл while, поместите сигнальное значение в первый элемент массива, расположенный после последнего исходного значения, а в условии цикла while просто проверяйте, не отрицательно ли значение.

Результаты использования ключевого слова break:

Лекция ?. Логика

Прекращение проверки сразу после получения ответа


Слайд 7 Упорядочивайте тесты так, чтобы самый быстрый и чаще

Упорядочивайте тесты так, чтобы самый быстрый и чаще всего оказывающийся истинным

всего оказывающийся истинным тест выполнялся первым.
Упорядочивание тестов по

частоте

Лекция ?. Логика

Нормальные случаи следует обрабатывать первыми, а вероятность выполнения неэффек- тивного кода должна быть низкой.
Этот принцип относится к блокам case и цепоч- кам операторов if-then-else.


Слайд 8 Пример плохо упорядоченного логического теста (Visual Basic):
Select inputCharacter

Пример плохо упорядоченного логического теста (Visual Basic):Select inputCharacter 	Case


Case "+", "="
ProcessMathSymbol( inputCharacter )
Case "0" To

"9"
ProcessDigit( inputCharacter )
Case ",", ".", ":", ";", "!", "?"
ProcessPunctuation( inputCharacter )
Case " "
ProcessSpace( inputCharacter )
Case "A" To "Z", "a" To "z"
ProcessAlpha( inputCharacter )
Case Else
ProcessError( inputCharacter )
End Select

Лекция ?. Логика

Упорядочивание тестов по частоте


Слайд 9 Пример хорошо упорядоченного логического теста (Visual Basic):
Select

Пример хорошо упорядоченного логического теста (Visual Basic): Select inputCharacter Case

inputCharacter
Case "A" To "Z", "a" To "z"
ProcessAlpha(

inputCharacter )
Case " "
ProcessSpace( inputCharacter )
Case ",", ".", ":", ";", "!", "?"
ProcessPunctuation( inputCharacter )
Case "0" To "9"
ProcessDigit( inputCharacter )
Case "+", "="
ProcessMathSymbol( inputCharacter )
Case Else
ProcessError( inputCharacter )
End Select

Лекция ?. Логика

Упорядочивание тестов по частоте


Слайд 10 Лекция ?. Логика
Упорядочивание тестов по частоте
Результаты оптимизации:

Лекция ?. ЛогикаУпорядочивание тестов по частоте Результаты оптимизации:

Слайд 11 Сравнения быстродействия похожих структур логики
Такой тип тестирование можно

Сравнения быстродействия похожих структур логикиТакой тип тестирование можно выполнить и для

выполнить и для блоков case, и для операторов if-then-else.
В

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

Лекция ?. Логика


Слайд 12 Замена сложных выражений на обращене к таблице
Иногда просмотр

Замена сложных выражений на обращене к таблице	Иногда просмотр таблицы может оказаться

таблицы может оказаться более быстрым, чем выполнение сложной логической

цепи.

Суть сложной сложной цепи обычно сводится к катего- ризации чего-либо.

Необходимо присвоить чему-то
номер категории на основе
принадлежности этого чего-то
к группам А, В и С:

Лекция ?. Логика

1

2

3

A

B

C

0

1

1

2

2


Слайд 13 Пример сложной логической цепи (C++):
if ( ( а

Пример сложной логической цепи (C++):if ( ( а && ! с

&& ! с ) 11 ( а && b

&& с ) ) {
category = 1;
}
else if ( ( b && ! а ) 11 ( а && с && !b ) ) {
category = 2;
}
else if ( с && !a && !b ) {
category = 3;
}
else {
category = 0;
}

Лекция ?. Логика

Замена сложных выражений на обращене к таблице


Слайд 14 Пример использования таблицы вместо сложной логики (C++):
static

Пример использования таблицы вместо сложной логики (C++): static int categoryTable[ 2

int categoryTable[ 2 ][ 2 ][ 2 ] =

{
// !b!c !bc b!c bc
0, 3, 2, 2, // !a
1, 2, 1, 1 // a
};

category = categoryTable[ a ][ b ][ с ];

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

Лекция ?. Логика

Замена сложных выражений на обращене к таблице


Слайд 15 Отложенные вычисления
Методика отложенных вычислений основана на принципе: “Программа

Отложенные вычисленияМетодика отложенных вычислений основана на принципе: “Программа делает что-то, только

делает что-то, только когда это действительно нужно”.
Лекция ?. Логика
Отложенное

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



Слайд 16 Размыкание цикла
Замыканием (switching) цикла называют при- нятие решения

Размыкание цикла	Замыканием (switching) цикла называют при- нятие решения внутри цикла при

внутри цикла при каждой его итерации.
Если во время

выполнения цикла решение не изменяется, вы можете разомкнуть (unswitch) цикл, приняв решение вне цикла.
Для размыкания нужно вывернуть цикл наизнанку, т. е. поместить циклы в условный оператор, а не условный оператор внутрь цикла.

Лекция ?. Циклы


Слайд 17 Пример замкнутого цикла (C++):
for ( i = 0;

Пример замкнутого цикла (C++):for ( i = 0; i < count;

i < count; i++ ) {

if ( sumType == SUMTYPE_NET ) {
netSum = netSum + amount[ i ];
}
else {
grossSum = grossSum + amount[ i ];
}
}

Пример разомкнутого цикла (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 ];
}
}

Размыкание цикла

Лекция ?. Циклы


Слайд 18 Объединение циклов
Если два цикла работают с одним набором

Объединение цикловЕсли два цикла работают с одним набором элемен- тов, можно

элемен- тов, можно выполнить их объединение (jamming).
Выгода здесь

объясняется устранением затрат, связанных с выполнением дополнительного цикла.

Пример отдельных циклов, которые можно объединить (Visual Basic):
For i = 0 to employeeCount - 1
employeeName( i ) = ""
Next

For i = 0 to employeeCount - 1
employeeEarnings( i ) = 0
Next

Лекция ?. Циклы


Слайд 19 Пример объединенного цикла (Visual Basic):
For i =

Пример объединенного цикла (Visual Basic): For i = 0 to employeeCount

0 to employeeCount - 1
employeeName( i ) =

""
employeeEarnings( i ) = 0
Next

Лекция ?. Циклы

Объединение циклов


Слайд 20 Пример однократного развертывания цикла (Java):
i = 0;
while (

Пример однократного развертывания цикла (Java):i = 0;while ( i < count

i < count - 1 ) {

a[ i ] = i;
a[ i + 1 ] = i + 1;
i = i + 2;
}
//Эти строки обрабатывают случай, который может быть упущен из-за увеличении счетчика цикла на 2, а не на 1.
if ( i == count ) {
а[ count - 1 ] = count - 1;
}

Лекция ?. Циклы

Развертывание цикла


Слайд 21 Развертывание цикла
Целью развертывания (unrolling) цикла является сокращение затрат,

Развертывание циклаЦелью развертывания (unrolling) цикла является сокращение затрат, связанных с его

связанных с его выполнением.
Полное развертывание цикла — быстрое

решение, эффективное при малом числе элементов, но оно непрактично, если элементов много или вы не знаете заранее, с каким числом элементов вы будете иметь дело.

Пример цикла, допускающего развертывание (Java):
i = 0;
while ( i < count ) {
a[ i ] = i;
i = i + 1;
}

Лекция ?. Циклы


Слайд 22 Минимизация объема работы, выполняемой внутри цикла
Одной из методик

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

повышения эффективности циклов является минимизация объема работы, выполняемой внутри

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

Лекция ?. Циклы


Слайд 23 Пример цикла, включающего сложное выражение с указателями (C++):
for

Пример цикла, включающего сложное выражение с указателями (C++):for ( i =

( i = 0; i < rateCount; i++ )

{
netRate[ i ] = baseRate[ i ] * rates->discounts->factors->net;
}

Пример упрощения сложного выражения с указателями (C++):
quantityDiscount = rates->discounts->factors->net;
for ( i = 0; i < rateCount; i++ ) {
netRate[ i ] = baseRate[ i ] * quantityDiscount;
}

Лекция ?. Циклы

Минимизация объема работы, выполняемой внутри цикла


Слайд 24 Сигнальные значения
Если цикл включает проверку слож- ного условия,

Сигнальные значенияЕсли цикл включает проверку слож- ного условия, время его выполнения

время его выполнения часто можно сократить, упростив проверку.
Лекция

?. Циклы

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


Слайд 25 Пример проверки сложного условия цикла (С#):
found = FALSE;
i

Пример проверки сложного условия цикла (С#):found = FALSE;i = 0;//Проверка сложного

= 0;
//Проверка сложного условия.
while ( ( !found ) &&

( i < count ) ) {
if ( item[ i ] == testValue ) {
found = TRUE;
}
else {
i++;
}
}
if ( found ) { … }

Сигнальные значения

Лекция ?. Циклы


Слайд 26 Пример использования сигнального значения для ускорения цикла (С#):
//

Пример использования сигнального значения для ускорения цикла (С#):// Установка сигнального значения

Установка сигнального значения с сохранением начальных значений. initialValue =

item[ count ];
//Не забудьте зарезервировать в конце массива место для сигнального значения.
item[ count ] = testValue;
i = 0;
while ( item[ i ] != testValue ) {
i++;
}
if ( i < count ) { … }

Сигнальные значения

Лекция ?. Циклы


Слайд 27 Вложение более ресурсоемкого цикла в менее ресурсоемкий
Если вы

Вложение более ресурсоемкого цикла в менее ресурсоемкийЕсли вы имеете дело с

имеете дело с вложенными циклами, подумайте, какой из них

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

Лекция ?. Циклы


Слайд 28 Пример вложенного цикла, который можно улучшить (Java):
for (

Пример вложенного цикла, который можно улучшить (Java):for ( column = 0;

column = 0; column < 100; column++ ) {

for ( row = 0; row < 5; row++ ) {
sum = sum + tablet row ][ column ];
}
}

Вложение более ресурсоемкого цикла в менее ресурсоемкий

Лекция ?. Циклы


Слайд 29 Снижение стоимости оператора
Под снижением стоимости (strength reduction) понимают

Снижение стоимости оператораПод снижением стоимости (strength reduction) понимают замену дорогой операции

замену дорогой операции на более дешевую, напри- мер, умножения

на сложение.

Лекция ?. Циклы

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


Слайд 30 Пример умножения с использованием индекса цикла (Visual Basic):
For

Пример умножения с использованием индекса цикла (Visual Basic):For i = 0

i = 0 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

Снижение стоимости оператора

Лекция ?. Циклы


Слайд 31 Использование целых чисел вместо чисел с плавающей точкой
Сложение

Использование целых чисел вместо чисел с плавающей точкой	Сложение и умножение целых

и умножение целых чисел, как правило, выполняются быстрее, чем

аналогичные операции над числами с плавающей запятой.

Лекция ?. Изменения типов данных


Слайд 32 Использование массивов с минимальным числом измерений
Использовать массивы, имеющие

Использование массивов с минимальным числом измеренийИспользовать массивы, имеющие несколько измерений, накладно.Лекция

несколько измерений, накладно.
Лекция ?. Изменения типов данных
Если вы сможете

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

Слайд 33 Пример стандартной инициализации двумерного массива (Java):
for ( row

Пример стандартной инициализации двумерного массива (Java):for ( row = 0; row

= 0; row < numRows; row++ ) {

for ( column = 0; column < numColumns; column++ ) { matrix[ row ][ column ] = 0;
}
}

Пример одномерного представления массива (Java):
for ( entry = 0; entry < numRows * numColumns; entry++ ) {
matrix[ entry ] = 0;
}

Использование массивов с минимальным числом измерений

Лекция ?. Изменения типов данных


Слайд 34 Минимизация числа обращений к массивам
Кроме минимизации числа обращений

Минимизация числа обращений к массивамКроме минимизации числа обращений к двумерным или

к двумерным или трехмерным массивам часто выгодно миними- зировать

число обращений к массивам вообще.
Подходящий кандидат для применения этой мето- дики – цикл, в котором повторно используется один и тот же элемент массива.

Пример необязательного обращения к массиву внутри цикла (C++):
for ( discountType = 0; discountType < typeCount; discountType++ ) {
for ( discountLevel = 0; discountLevel < levelCount; discountLevel++ ) {
rate[ discountLevel ] = rate[ discountLevel ] * discount[ discountType ];
}
}

Лекция ?. Изменения типов данных


Слайд 35 Пример вынесения обращения к массиву за пределы цикла

Пример вынесения обращения к массиву за пределы цикла (C++):for ( discountType

(C++):
for ( discountType = 0; discountType < typeCount; discountType++

) {
this.Discount = discount[ discountType ];
for ( discountLevel = 0; discountLevel < levelCount; discountLevel++ ) { rate[ discountLevel ] = rate[ discountLevel ] * thisDiscount;
}
}

Минимизация числа обращений к массивам

Лекция ?. Изменения типов данных


Слайд 36 Использование дополнительных индексов
Использование дополнительного индекса предпола- гает добавление

Использование дополнительных индексовИспользование дополнительного индекса предпола- гает добавление данных, связанных с

данных, связанных с основным типом данных и повышающих эффективность

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

Лекция ?. Изменения типов данных


Слайд 37 Иногда выгоднее работать с индексом типа данных, а

Иногда выгоднее работать с индексом типа данных, а не с самим

не с самим типом данных.
Если элементы типа данных велики

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

Независимая параллельная структура индексации

Лекция ?. Изменения типов данных


Слайд 38 Кэширование – это такой способ хранения нескольких значений,

Кэширование – это такой способ хранения нескольких значений, при котором значения,

при котором значения, используемые чаще всего, получить легче, чем

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

Кэширование

Пример метода, напрашивающегося на кэширование (Java):
double Hypotenuse( double sideA, double sideB) {
return Math.sqrt( ( sideA * sideA ) + ( sideB * sideB ) );
}

Лекция ?. Изменения типов данных


Слайд 39 Алгебраические тождества иногда позволяют заме- нить дорогие операции

Алгебраические тождества иногда позволяют заме- нить дорогие операции на более дешевые.Пример:

на более дешевые.
Пример:
not a and not b
not

(a or b)

Выбрав второе выражение вместо первого, вы сэкономите одну операцию not.

Аглебраические тождества

Лекция ?. Выражения


Слайд 40 Пример кэширования для предотвращения дорогих вычислений (Java):
private double

Пример кэширования для предотвращения дорогих вычислений (Java):private double cachedHypotenuse = 0;

cachedHypotenuse = 0; private double cachedSideA = 0;
private

double cachedSideB = 0;
public double Hypotenuse( double sideA, double sideB ) {
if ( ( sideA == cachedSideA ) && ( sideB == cachedSideB ) ) {
return cachedHypotenuse;
}
// Вычисление новой гипотенузы и ее кэширование.
cachedHypotenuse = Math.sqrt( ( sideA * sideA ) + ( sideB * sideB ) );
cachedSideA = sideA;
cachedSideB = sideB;
return cachedHypotenuse;
}

Кэширование

Лекция ?. Изменения типов данных


Слайд 41 замена умножения сложением;
замена возведения в степень умножением;
замена тригонометрических

замена умножения сложением;замена возведения в степень умножением;замена тригонометрических функций их эквивалентами;замена

функций их эквивалентами;
замена типа longlong на long или int

(следите при этом за аспектами производительности, связанными с примене- нием целых чисел естественной и неестественной длины);
замена чисел с плавающей запятой числами с фиксированной точкой или целые числа;
замена чисел с плавающей запятой с удвоенной точностью числами с одинарной ТОЧНОСТЬЮ;
замена умножения и деления целых чисел на два операциями сдвига.

Снижение стоимости операций

Подразумевает замену дорогой операции более дешевой.

Лекция ?. Выражения


Слайд 42 Пример вычисления многочлена (Visual Basic):
value = coefficient(0) For

Пример вычисления многочлена (Visual Basic):value = coefficient(0) For power = 1

power = 1 To order
value = value + coefficient(power)

* x*power Next

Пример снижения стоимости вычисления многочлена (VisualBasic):
value = coefficient( 0 )
powerOfX = x
For power = 1 to order
value = value + coefficient( power ) * powerOfX
powerOfX = powerOfX * x Next

Снижение стоимости операций

Лекция ?. Выражения


Слайд 43 Инициализация во время компиляции
Если вы вызываете метод, передавая

Инициализация во время компиляции	Если вы вызываете метод, передавая ему в ка-

ему в ка- честве единственного аргумента константу попробуйте сначала

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

Пример метода, вычисляющего двоичный логарифм с использованием системных методов (C++):
unsigned int Log2( unsigned int x ) {
return (unsigned int) ( log( x ) / log( 2 ) );
}

Лекция ?. Выражения


Слайд 44 Недостатки системных методов
Системные методы дороги и часто обеспечивают

Недостатки системных методов	Системные методы дороги и часто обеспечивают избыточную точность. Если

избыточную точность. Если не требуется такая точность, нет смысла

тратить на нее время.

Пример метода, возвращающего значение двоичного логарифма (C++):
unsigned int Log2( unsigned int x ) {
if (x< 2 ) return 0 ;
if(x< 4 ) return 1 ;
if(x< 8 ) return 2 ;
if(x< 16 ) return 3 ;
if(x< 32 ) return 4 ;
if(x< 64 ) return 5 ;
….
if ( x < 2147483648 ) return 30;
return 31 ;
}

Лекция ?. Выражения


Слайд 45 Пример метода, вычисляющего двоичный логарифм с использованием системного

Пример метода, вычисляющего двоичный логарифм с использованием системного метода и константы

метода и константы (C++):
const double L0G2 = 0.69314718;
unsigned int

Log2( unsigned int x ) {
return (unsigned int) ( log( x ) / L0G2 );
}

Инициализация во время компиляции

Лекция ?. Выражения


Слайд 46 Пример метода, определяющего примерное значение двоичного логарифма с

Пример метода, определяющего примерное значение двоичного логарифма с использованием оператора сдвига

использованием оператора сдвига вправо (C++):
unsigned int Log2( unsigned int

x ) {
unsigned int i = 0;
while ((x=(x"1))!=0){
i++;
}
return i ;
}

Недостатки системных методов

Лекция ?. Выражения


Слайд 47 Использование констант корректного типа
Используйте именованные константы и литералы,

Использование констант корректного типаИспользуйте именованные константы и литералы, имеющие тот же

имеющие тот же тип, что и переменные, которым они

присваиваются.
Если константа и соответствующая ей переменная имеют разные типы, перед присвоением константы переменной компилятор должен будет выполнить преобразование типа.
Хорошие компиляторы преобразуют типы во время компиляции, чтобы не снижалась производитель- ность в период выполнения программы.
Менее эффективные компиляторы или интерпрета- торы генерируют код, преобразующий типы в период выполнения.

Лекция ?. Выражения


Слайд 48 Предварительное вычисление результатов
При низкоуровневом проектировании часто приходится решать,

Предварительное вычисление результатовПри низкоуровневом проектировании часто приходится решать, вычислять ли результаты

вычислять ли результаты по ходу дела или лучше вычислить

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

Лекция ?. Выражения


Слайд 49 Пример сложного выражения, которое можно вычислить предварительно (Java):
double

Пример сложного выражения, которое можно вычислить предварительно (Java):double ComputePayment( long loanAmount,

ComputePayment( long loanAmount, int months, double interestRate) {
return loanAmount

/
( ( 1.0 - Math.pow( ( 1.0 + ( interestRate /12.0)), -months ) ) / ( interestRate / 12.0 ) );
}

Предварительное вычисление результатов

Лекция ?. Выражения


Слайд 50 Пример предварительного вычисления сложного выражения (Java):
double ComputePayment( long

Пример предварительного вычисления сложного выражения (Java):double ComputePayment( long loanAmount, int months,

loanAmount, int months, double interestRate ) {
//Новая переменная

interestlndex используется как индекс массива loanDivisor.
int interestlndex = Math.round( ( interestRate - LOWEST_RATE ) * GRANULARITY * 100.00 );
return loanAmount / loanDivisor[ interestlndex ][ months ];
}

Предварительное вычисление результатов

Лекция ?. Выражения


Слайд 51 вычисление результатов до выполнения программы и связывание их

вычисление результатов до выполнения программы и связывание их с констан- тами

с констан- тами во время компиляции;

Предварительное вычисление результатов
Лекция ?.

Выражения

вычисление результатов до выполнения прог- раммы и присвоение их переменным, используе- мым в период выполнения;
вычисление результатов до выполнения прог- раммы и сохранение их в файле, загружаемом в период выполнения;


Слайд 52 однократное вычисление результатов при запуске программы и их

однократное вычисление результатов при запуске программы и их использование во всех

использование во всех последующих случаях;
Предварительное вычисление результатов
вычисление как можно

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

Лекция ?. Выражения


Слайд 53 Устранение часто используемых подвыражений
Если какое-то выражение повторяется в

Устранение часто используемых подвыражений	Если какое-то выражение повторяется в коде несколько раз,

коде несколько раз, присвойте его значение переменной и используйте

переменную вместо вычисления выражения в нескольких местах.

Пример часто используемого подвыражения (Java):
payment = loanAmount / ((1.0 - Math.pow( 1.0 + ( interestRate /12.0), - months ) ) / ( interestRate / 12.0 ));

Пример устранения часто используемого подвыражения (Java):
monthlylnterest = interestRate / 12.0;
payment = loanAmount / (( 1.0 - Math.pow( 1.0 + monthlylnterest, - months ) )
/ monthlylnterest );

Лекция ?. Выражения


Слайд 54 Одним из самых эффективных способов оптимизации кода является

Одним из самых эффективных способов оптимизации кода является грамотная декомпозиция программы

грамотная декомпозиция программы на методы.
Небольшие, хорошо определенные мето-

ды делают программу компактнее, устра- няя повторяющиеся фрагменты кода.

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

Лекция ?. Методы

О методах


Слайд 55 В некоторых случаях можно сэкономить несколько нано секунд,

В некоторых случаях можно сэкономить несколько нано секунд, встроив код метода

встроив код метода в программу, используя ключевое слово inline

языка C++ или аналогичную возможность.
Если ваш язык не поддерживает inline, но имеет препро цессор макросов, вы можете встраивать код при помощи макроса, включая и выключая встраивание по требованию.
Встроив код, вы можете как улучшить производитель- ность, так и ухудшить ее.

Встраивание методов

Лекция ?. Методы


Слайд 56 Переписывание кода на низкоуровневом языке
1. Напишите все приложение

Переписывание кода на низкоуровневом языке1. Напишите все приложение на высокоуровневом языке.2.

на высокоуровневом языке.
2. Выполните полное тестирование приложения и проверьте

его корректность.
3. Если производительность недостаточна, выполните профилирование приложения с целью выявления горячих точек. Так как около 50% времени выполнения программы обычно приходится примерно на 5% кода, горячими точками обычно будут небольшие фрагменты программы.
4. Перепишите несколько небольших фрагментов на низко- уровневом языке для повышения общей производитель ности программы.

Лекция ?. Методы


Слайд 57 Оптимизация кода подразумевает на- хождение компромисса между слож-

Оптимизация кода подразумевает на- хождение компромисса между слож- ностью, удобочитаемостью, простотой

ностью, удобочитаемостью, простотой и удобством сопровождения программы, с одной

стороны, и желанием повы- сить производительность – с другой.

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


В заключении…

Лекция ?. Методы


Слайд 58 Но если оптимизация не оправдывает проведе- ния профилирования,

Но если оптимизация не оправдывает проведе- ния профилирования, она не может

она не может оправдать ухудшения удобочитаемости, удобства сопро- вождения

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

В заключении…

Лекция ?. Методы


Слайд 59 Результаты конкретных видов оптимизации во многом за- висят

Результаты конкретных видов оптимизации во многом за- висят от языка, компилятора

от языка, компилятора и среды. Не оценив резуль татов

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

Выводы


Слайд 60 Ссылки

Ссылки

  • Имя файла: obektnye-tehnologii-konstruirovaniya-po.pptx
  • Количество просмотров: 101
  • Количество скачиваний: 0