Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

l8_nc

.pdf
Скачиваний:
13
Добавлен:
19.04.2015
Размер:
732.67 Кб
Скачать

Если оптимизация все-таки нужна…

© 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]