You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Необходимо было обработать файл с данными, чуть больше ста мегабайт.
7
+
8
+
У нас уже была программа на `ruby`, которая умела делать нужную обработку.
9
+
10
+
Она успешно работала на файлах размером пару мегабайт, но для большого файла она работала слишком долго, и не было понятно, закончит ли она вообще работу за какое-то разумное время.
11
+
12
+
Я решил исправить эту проблему, оптимизировав эту программу.
13
+
14
+
## Формирование метрики
15
+
Для того, чтобы понимать, дают ли мои изменения положительный эффект на быстродействие программы я придумал использовать такую метрику: Время выполнения программы с частичным объемом данных за вменяемое время
16
+
17
+
## Гарантия корректности работы оптимизированной программы
18
+
Программа поставлялась с тестом. Выполнение этого теста в фидбек-лупе позволяет не допустить изменения логики программы при оптимизации.
19
+
20
+
## Feedback-Loop
21
+
Для того, чтобы иметь возможность быстро проверять гипотезы я выстроил эффективный `feedback-loop`, который позволил мне получать обратную связь по эффективности сделанных изменений за *время, которое у вас получилось*
22
+
23
+
Вот как я построил `feedback_loop`:
24
+
Измерив время выполнения программы на разном объеме дынных, алгоритмическая сложность получилась O(n^2), т.е. время выполнения в зависимости от объема данных возрастает квадратично.
25
+
26
+
- Нужно зафиксировать бюджет метрики, которую определили выше.
27
+
То-есть выбрать объем данных, который выполняется за адекватное время, на первой итерации например 5 сек. (20_000 строк кода на моей машине)
28
+
- Защитить метрику от дальнейшей деградации, написать тест
29
+
- С помощью профилировщика найти главную точку роста (Профилируем с выключенным GC предварительно прогрев кеши)
30
+
- Внести оптимизационные правки
31
+
- С помощью профилировщика проверить есть ли улучшения
32
+
- Запустить тест, проверить если улучшения есть, если да то закоммитить.
33
+
34
+
## Вникаем в детали системы, чтобы найти главные точки роста
35
+
Для того, чтобы найти "точки роста" для оптимизации я воспользовался rbspy (удобно, потому что встроен в rubymine), stackprof и ruby-prof в разных режимах отчетов
36
+
37
+
Вот какие проблемы удалось найти и решить
38
+
39
+
### Ваша находка №1
40
+
- stackprof cli и rbspy указали на одинаковую точку роста, 89% занимает `user_sessions = sessions.select { |session| session['user_id'] == user['id'] }`
0 commit comments