|
12 | 12 | Я решил исправить эту проблему, оптимизировав эту программу. |
13 | 13 |
|
14 | 14 | ## Формирование метрики |
15 | | -Для того, чтобы понимать, дают ли мои изменения положительный эффект на быстродействие программы я придумал использовать такую метрику: время выполнения программы. |
| 15 | +Для того, чтобы понимать, дают ли мои изменения положительный эффект на быстродействие программы я придумал использовать такую метрику: время выполнения программы для части данных (сначала 50к, потом 100к). |
16 | 16 |
|
17 | 17 | Сначала сделал гипотезу о том, что асимптотика времени работы программы квадратичная: отношение количества записей к времени выполнения в секундах: 100000/115 750000/61 50000/26, 25000/6). Подтвердил эту гипотезу с помощью теста rspec-benchmark. |
18 | | -В таком случае для полного объема понадобится 4.7 дней. |
19 | 18 |
|
20 | 19 | ## Гарантия корректности работы оптимизированной программы |
21 | 20 | Программа поставлялась с тестом. Выполнение этого теста в фидбек-лупе позволяет не допустить изменения логики программы при оптимизации. |
|
26 | 25 | Вот как я построил `feedback_loop`: профилирование - изменение кода - тестирование – бенчмаркинг – откат при отсутствии разницы от оптимизации/сохранение результатов |
27 | 26 |
|
28 | 27 | ## Вникаем в детали системы, чтобы найти главные точки роста |
29 | | -Для того, чтобы найти "точки роста" для оптимизации я воспользовался rbspy |
| 28 | +Для того, чтобы найти "точки роста" для оптимизации я воспользовался rbspy, stackprof, ruby-prof |
30 | 29 |
|
31 | 30 | Вот какие проблемы удалось найти и решить |
32 | 31 |
|
|
98 | 97 |
|
99 | 98 | ## Результаты |
100 | 99 | В результате проделанной оптимизации наконец удалось обработать файл с данными. |
101 | | -Удалось улучшить метрику системы с 4.7 дней до 24 секунд и уложиться в заданный бюджет. |
| 100 | +Удалось улучшить метрику системы на 100к с 115с до 5с секунд и уложиться в заданный бюджет. Для полного файла время выполнение стало 24с. |
102 | 101 |
|
103 | 102 | ## Защита от регрессии производительности |
104 | 103 | Для защиты от потери достигнутого прогресса при дальнейших изменениях программы добавил два теста: прогон на 100к данных до 5 секунд, проверка на линейную асимптотику на основе данных от 1000 до 100000 записей. |
0 commit comments