быстродействия, а так же сокращение объема кода.
В чем заключается
оптимизация?Инструменты оптимизации кода:
Рефакторинг;
Использование стратегий оптимизации.
Лекция ?. Вводная
FindSlide.org - это сайт презентаций, докладов, шаблонов в формате PowerPoint.
Email: Нажмите что бы посмотреть
Инструменты оптимизации кода:
Рефакторинг;
Использование стратегий оптимизации.
Лекция ?. Вводная
Некоторые языки поддерживают "сокращенную оценку выражений", при которой компилятор генери- рует код, автоматически прекращающий проверку после получения ответа.
Сокращенная оценка выполняется, например, для стандартных операторов C++ и "условных" операторов Java.
Лекция ?. Логика
Прекращение проверки сразу после получения ответа
Пример сокращенной оценки:
if ( 5 < х ) then
if ( х < 10 ) then …
Лекция ?. Логика
Прекращение проверки сразу после получения ответа
Оптимизация:
Включите в код оператор break после строки negativeInputFound = true.
Если язык не поддерживает оператор break, имитируйте его при помощи оператора goto, передающего управ- ление первой команде, расположенной после цикла.
Лекция ?. Логика
Прекращение проверки сразу после получения ответа
Результаты использования ключевого слова break:
Лекция ?. Логика
Прекращение проверки сразу после получения ответа
Лекция ?. Логика
Нормальные случаи следует обрабатывать первыми, а вероятность выполнения неэффек- тивного кода должна быть низкой.
Этот принцип относится к блокам case и цепоч- кам операторов if-then-else.
Лекция ?. Логика
Упорядочивание тестов по частоте
Лекция ?. Логика
Упорядочивание тестов по частоте
Лекция ?. Логика
Суть сложной сложной цепи обычно сводится к катего- ризации чего-либо.
Необходимо присвоить чему-то
номер категории на основе
принадлежности этого чего-то
к группам А, В и С:
Лекция ?. Логика
1
2
3
A
B
C
0
1
1
2
2
Лекция ?. Логика
Замена сложных выражений на обращене к таблице
Определение таблицы понять нелегко, поэтому используйте любые комментарии, способные помочь.
Лекция ?. Логика
Замена сложных выражений на обращене к таблице
Лекция ?. Циклы
Пример разомкнутого цикла (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 ];
}
}
Размыкание цикла
Лекция ?. Циклы
Пример отдельных циклов, которые можно объединить (Visual Basic):
For i = 0 to employeeCount - 1
employeeName( i ) = ""
Next
…
For i = 0 to employeeCount - 1
employeeEarnings( i ) = 0
Next
Лекция ?. Циклы
Лекция ?. Циклы
Объединение циклов
Лекция ?. Циклы
Развертывание цикла
Пример цикла, допускающего развертывание (Java):
i = 0;
while ( i < count ) {
a[ i ] = i;
i = i + 1;
}
Лекция ?. Циклы
Лекция ?. Циклы
Пример упрощения сложного выражения с указателями (C++):
quantityDiscount = rates->discounts->factors->net;
for ( i = 0; i < rateCount; i++ ) {
netRate[ i ] = baseRate[ i ] * quantityDiscount;
}
Лекция ?. Циклы
Минимизация объема работы, выполняемой внутри цикла
В случае циклов поиска используется сигнальное значение (sentinel value) — значение, которое распо- лагается сразу после окончания диапазона поиска и непременно завершает поиск.
Сигнальное значение можно использовать почти в любой ситуации, требующей выполнения линейного поиска, причем не только в массивах, но и в связных списках.
Сигнальные значения
Лекция ?. Циклы
Сигнальные значения
Лекция ?. Циклы
Лекция ?. Циклы
Вложение более ресурсоемкого цикла в менее ресурсоемкий
Лекция ?. Циклы
Лекция ?. Циклы
Сложение обычно выполняется быстрее, чем умножение, и, если вы можете вычислить то же число заменив умножение на прибавление значения при каждой итерации цикла, это скорее всего приведет к ускорению выполнения кода.
Пример замены умножения на сложение (Visual Basic):
incrementalCommission = revenue * baseCommission * discount cumulativeCommission = incrementalCommission
For i = 0 to saleCount - 1
commission( i ) = cumulativeCommission
cumulativeCommission = cumulativeCommission + incrementalCommission
Next
Снижение стоимости оператора
Лекция ?. Циклы
Лекция ?. Изменения типов данных
Пример одномерного представления массива (Java):
for ( entry = 0; entry < numRows * numColumns; entry++ ) {
matrix[ entry ] = 0;
}
Использование массивов с минимальным числом измерений
Лекция ?. Изменения типов данных
Пример необязательного обращения к массиву внутри цикла (C++):
for ( discountType = 0; discountType < typeCount; discountType++ ) {
for ( discountLevel = 0; discountLevel < levelCount; discountLevel++ ) {
rate[ discountLevel ] = rate[ discountLevel ] * discount[ discountType ];
}
}
Лекция ?. Изменения типов данных
Минимизация числа обращений к массивам
Лекция ?. Изменения типов данных
Лекция ?. Изменения типов данных
Независимая параллельная структура индексации
Лекция ?. Изменения типов данных
Кэширование
Пример метода, напрашивающегося на кэширование (Java):
double Hypotenuse( double sideA, double sideB) {
return Math.sqrt( ( sideA * sideA ) + ( sideB * sideB ) );
}
Лекция ?. Изменения типов данных
Выбрав второе выражение вместо первого, вы сэкономите одну операцию not.
Аглебраические тождества
Лекция ?. Выражения
Кэширование
Лекция ?. Изменения типов данных
Снижение стоимости операций
Подразумевает замену дорогой операции более дешевой.
Лекция ?. Выражения
Пример снижения стоимости вычисления многочлена (VisualBasic):
value = coefficient( 0 )
powerOfX = x
For power = 1 to order
value = value + coefficient( power ) * powerOfX
powerOfX = powerOfX * x Next
Снижение стоимости операций
Лекция ?. Выражения
Пример метода, вычисляющего двоичный логарифм с использованием системных методов (C++):
unsigned int Log2( unsigned int x ) {
return (unsigned int) ( log( x ) / log( 2 ) );
}
Лекция ?. Выражения
Пример метода, возвращающего значение двоичного логарифма (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 ;
}
Лекция ?. Выражения
Инициализация во время компиляции
Лекция ?. Выражения
Недостатки системных методов
Лекция ?. Выражения
Лекция ?. Выражения
Лекция ?. Выражения
Предварительное вычисление результатов
Лекция ?. Выражения
Предварительное вычисление результатов
Лекция ?. Выражения
вычисление результатов до выполнения прог- раммы и присвоение их переменным, используе- мым в период выполнения;
вычисление результатов до выполнения прог- раммы и сохранение их в файле, загружаемом в период выполнения;
Лекция ?. Выражения
Пример часто используемого подвыражения (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 );
Лекция ?. Выражения
Методы упрощают оптимизацию, потому что рефакто- ринг одного метода улучшает все методы, которые его вызывают.
Небольшие методы относительно легко переписать на низкоуровневом языке.
Объемные методы понять сложно, а после переписыва- ния их на низкоуровневом языке вроде ассемблера это вообще невыполнимо.
Лекция ?. Методы
О методах
Встраивание методов
Лекция ?. Методы
Лекция ?. Методы
Необходимое при оптимизации перепрофилирование кода приводит к значительному росту затрат на сопровождение программы.
Хороший способ против преждевременной оптимизации и для созданию ясного кода: требуйте, чтобы оптимизация приводила к измеримому улучшению. Если оптимизация оправдывает профилирование кода и оценку результатов, ее следует выполнить, если будет показано, что она работает.
В заключении…
Лекция ?. Методы
В заключении…
Лекция ?. Методы
Выводы