l8_nc
.pdfЕсли оптимизация все-таки нужна…
© 2013 NetCracker Technology Corporation Confidential |
11 |
Технические подробности
1.Убедитесь, что программа слишком медленно работает и требует оптимизации.
2.Определите, какая часть кода самая медленная, и нацельте на нее свои усилия.
3.Проверьте производительность кода, выбранного для оптимизации.
4.Оптимизируйте код.
5.Протестируйте оптимизированный код и убедитесь, что он сохранил работоспособность (очень существенно).
6.Проверьте, насколько стало лучше.
© 2013 NetCracker Technology Corporation Confidential |
12 |
Убедитесь, что нужна оптимизация
Следует забыть о недостаточной эффективности примерно в 97% случаев; необдуманная оптимизация
– корень всех зол
Д.Кнут
Свое решение вы должны принимать на основании технических требований к программе или исследования ее юзабилити (usability). После этого вы можете определить, что для вас важнее – оптимизация или добавление новых функций и исправление ошибок.
© 2013 NetCracker Technology Corporation Confidential |
13 |
Определите самую медленную часть кода
Принцип Парето (Правило 80/20)
•«20 % усилий дают 80 % результата, а остальные 80 % усилий — лишь 20 % результата»
•«Значимых факторов немного, а факторов тривиальных множество — лишь единичные действия приводят к важным результатам.»
•«Бо́льшая часть действий, групповых или индивидуальных, являет собой пустую трату времени. Они не дают ничего реального для достижения желаемого результата.»
© 2013 NetCracker Technology Corporation Confidential |
14 |
Request-log-analyzer: что будем оптимизировать?
Request duration - by sum Hits Sum Mean StdDev Min Max 95 %tile
Api::TextbooksController#attendence.html [POST] |
18958 1h07m29s |
0.21s |
|
0.48s |
|
0.00s |
24.50s |
0.01s-0.99s |
||||
StudyTools::TesterController#review.html [GET] |
|
4068 |
|
24m34s |
0.36s |
|
2.42s |
|
0.00s |
|
2m32s |
0.12s-1.26s |
StudyTools::TesterController#next_question.html [GET] |
4629 |
|
20m25s |
0.26s |
|
0.40s |
|
0.00s |
|
9.52s |
0.05s-1.13s |
|
Home::RolesController#index.html [GET] |
|
1118 |
|
14m03s |
0.75s |
|
1.14s |
|
0.01s |
26.46s |
0.01s-2.79s |
|
StudyTools::TesterController#check_answer.html [POST] |
4597 |
|
13m18s |
0.17s |
|
0.41s |
|
0.01s |
14.39s |
0.06s-0.85s |
||
Study::ResultsController#by_task.html [GET] |
|
1197 |
|
10m25s |
0.52s |
|
0.49s |
|
0.01s |
|
8.39s |
0.11s-2.22s |
Study::ResultsController#index.html [GET] |
|
721 |
10m19s |
0.86s |
1.30s |
0.01s 26.88s 0.10s-2.65s |
||||||
Study::CourseController#index.html [GET] |
|
1390 |
|
6m23s |
0.28s |
|
0.41s |
|
0.00s |
|
5.26s |
0.08s-1.33s |
Home::PmController#list.html [GET] |
|
299 |
|
5m25s |
1.09s |
1.66s |
|
0.01s |
15.85s 0.01s-5.06s |
|||
Home::RolesController#logvars.html [POST] |
|
2340 |
|
4m49s |
0.12s |
|
0.32s |
|
0.00s |
|
8.60s |
0.03s-0.98s |
StudyTools::TesterController#show_question.html [GET] |
915 |
|
4m37s |
0.30s |
|
0.48s |
|
0.02s |
10.28s 0.12s-1.15s |
|||
StudyTools::DropController#review.html [GET] |
|
515 |
|
4m29s |
0.52s |
|
0.74s |
|
0.01s |
|
8.31s |
0.09s-2.22s |
StudyTools::TesterController#show_question.html [POST] |
829 |
|
4m10s |
0.30s |
|
0.37s |
|
0.01s |
|
5.27s |
0.12s-1.17s |
|
Home::PmController#show.html [GET] |
|
868 |
|
4m09s |
0.29s |
|
0.50s |
|
0.00s |
|
5.29s |
0.02s-1.69s |
StudyTools::DropController#start.html [GET] |
|
426 |
|
2m45s |
0.39s |
|
1.77s |
|
0.01s |
36.36s 0.10s-1.31s |
||
StudyTools::TesterController#finish.html [POST] |
|
198 |
|
2m38s |
0.80s |
|
0.59s |
|
0.01s |
|
4.27s |
0.06s-2.41s |
LoginController#index.html [GET] |
|
3740 |
|
2m27s |
0.04s |
|
0.14s |
|
0.01s |
|
3.60s |
0.01s-0.29s |
StudyTools::DropController#approve.html [POST] |
|
102 |
|
2m18s |
1.35s |
2.11s |
|
0.04s |
18.80s 0.07s-6.65s |
|||
StudyTools::TaskController#start.html [GET] |
|
1148 |
|
2m08s |
0.11s |
|
0.47s |
|
0.01s |
14.00s 0.03s-0.63s |
||
StudyTools::DropController#create.html [POST] |
|
217 |
|
1m54s |
0.53s |
|
0.68s |
|
0.03s |
|
8.75s |
0.11s-1.83s |
© 2013 NetCracker Technology Corporation Confidential |
15 |
Профайлинг
Разместите сами в своем коде контроль времени исполнения. Проверьте, чтобы источник временных отсчетов был точен и чтобы затраты на чтение времени не слишком влияли на производительность программы.
•Подсчитайте число вызовов каждой функции (некоторые библиотеки для отладки обеспечивают поддержку такого рода действий).
•Воспользуйтесь ловушками, предоставляемыми компилятором, для вставки собственного кода, ведущего учет входа в функции и возврата из них. Такие возможности предоставляются многими компиляторами; в некоторых профайлерах реализован такой же механизм.
•Воспользуйтесь счетчиком команд; периодически прерывайте программу в отладчике, чтобы выяснить, где находится управление. Это труднее осуществить в многопоточных программах, и такой способ очень медленный.
•Проверьте, как влияет отдельная функция на скорость выполнения программы, заставив ее выполняться медленнее. Если программа станет выполняться на 10% дольше, то функция занимает примерно 10% времени работы. Это может быть самым примитивным способом хронометража.
© 2013 NetCracker Technology Corporation Confidential |
16 |
Тестирование кода
•Используйте одни и те же входные данные в тестах, проводимых до и после оптимизации.
В противном случае ваши тесты окажутся бессмысленными; вы будете сравнивать хрен с апельсином. Лучше всего воспользоваться автоматизированным контрольным примером – с такого же рода реальными репрезентативными данными, как при профилировании.
•Выполняйте тесты в обычных одинаковых условиях, чтобы исключить влияние на результат таких факторов, как загрузка ЦП или объем свободной памяти.
•Ваши тесты не должны зависеть от того, насколько быстро пользователи вводят данные, поскольку скорость работы пользователей может меняться в широком диапазоне. Постарайтесь автоматизировать все, что только удастся.
© 2013 NetCracker Technology Corporation Confidential |
17 |
Оптимизация кода
•Ускорение может быть достигнуто в результате как простой переработки небольшого раздела кода, так и серьезных изменений на уровне проекта. Задача в том, чтобы оптимизировать код, не поломав его при этом.
•Определите, какие способы существуют для оптимизации данного кода, и выберите из них лучший.
•Вносите изменения по одному; это менее рискованно и позволяет определить, от чего в большей степени зависит производительность.
•Иногда наибольший эффект оптимизации дают совершенно неожиданные факторы.
© 2013 NetCracker Technology Corporation Confidential |
18 |
После оптимизации
• Не забудьте провести тестирование оптимизированного кода, чтобы убедиться в успешности сделанных модификаций.
Если оптимизация не удалась, отмените сделанные изменения. Тут вам поможет система управления версиями, с помощью которой вы вернетесь к предыдущему варианту кода.
• Отмените также те изменения, которые незначительно оптимизировали код.
Лучше иметь ясный код, чем скромные результаты оптимизации (если, конечно, у вас нет абсолютной необходимости ускорить код и отсутствуют другие способы сделать это).
© 2013 NetCracker Technology Corporation Confidential |
19 |
Подходы к оптимизации
•Заменить медленный код быстрым
•Реже обращаться к медленному коду
•Откладывать выполнение
© 2013 NetCracker Technology Corporation Confidential |
20 |