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
Copy file name to clipboardExpand all lines: case-study-template.md
+32-20Lines changed: 32 additions & 20 deletions
Original file line number
Diff line number
Diff line change
@@ -12,45 +12,57 @@
12
12
Я решил исправить эту проблему, оптимизировав эту программу.
13
13
14
14
## Формирование метрики
15
-
Для того, чтобы понимать, дают ли мои изменения положительный эффект на быстродействие программы я придумал использовать такую метрику: *тут ваша метрика*
15
+
Для того, чтобы понимать, дают ли мои изменения положительный эффект на быстродействие программы я придумал использовать такую метрику:
16
+
Изменение времени обработки файла средних размеров(30000 строк)
16
17
17
18
## Гарантия корректности работы оптимизированной программы
18
19
Программа поставлялась с тестом. Выполнение этого теста в фидбек-лупе позволяет не допустить изменения логики программы при оптимизации.
19
20
20
21
## Feedback-Loop
21
-
Для того, чтобы иметь возможность быстро проверять гипотезы я выстроил эффективный `feedback-loop`, который позволил мне получать обратную связь по эффективности сделанных изменений за *время, которое у вас получилось*
22
+
Для того, чтобы иметь возможность быстро проверять гипотезы я выстроил эффективный `feedback-loop`, который позволил мне получать обратную связь по эффективности сделанных изменений за 0.3 сек
22
23
23
-
Вот как я построил `feedback_loop`: *как вы построили feedback_loop*
24
+
Вот как я построил `feedback_loop`:
25
+
- Профилирование и поиск наиболее затратных мест в программе
26
+
- Оптимизация этих мест
27
+
- Зеленые тесты
28
+
- Итоговый результат
24
29
25
30
## Вникаем в детали системы, чтобы найти главные точки роста
26
-
Для того, чтобы найти "точки роста" для оптимизации я воспользовался *инструментами, которыми вы воспользовались*
31
+
Для того, чтобы найти "точки роста" для оптимизации я воспользовался RubyProf. Попробовал разные форматы, но самым удобным показался callgrind.
27
32
28
33
Вот какие проблемы удалось найти и решить
29
34
30
35
### Ваша находка №1
31
-
- какой отчёт показал главную точку роста
32
-
- как вы решили её оптимизировать
33
-
- как изменилась метрика
34
-
- как изменился отчёт профилировщика - исправленная проблема перестала быть главной точкой роста?
36
+
- Array#select
37
+
- Было решено на этапе чтения файла сразу готовить хэш с массивом сессий с ключем user_id, чтобы уйти от сложности O(n^2)
38
+
- Для файла с 30k строк:
39
+
Было: 66.977 s
40
+
Стало: 1.076115 s
41
+
- Проблема перестала быть точкой роста
35
42
36
-
### Ваша находка №2
37
-
- какой отчёт показал главную точку роста
38
-
- как вы решили её оптимизировать
39
-
- как изменилась метрика
40
-
- как изменился отчёт профилировщика - исправленная проблема перестала быть главной точкой роста?
41
43
42
-
### Ваша находка №X
43
-
- какой отчёт показал главную точку роста
44
-
- как вы решили её оптимизировать
45
-
- как изменилась метрика
46
-
- как изменился отчёт профилировщика - исправленная проблема перестала быть главной точкой роста?
44
+
### Ваша находка №2
45
+
- Array#each в месте где происходит подсчёт количества уникальных браузеров
46
+
- Использовать map и uniq
47
+
- Для файла с 30 к строк:
48
+
Было: 1.076115 s
49
+
Стало: 0.781335 s
50
+
- Проблема перестала быть точкой роста
51
+
52
+
### Ваша находка №3
53
+
- Следующая точка роста Object#collect_stats_from_users
54
+
- Решил сократить количество вызовов метода, убрал лишние вызовы map внутри, также убрал merge с вызовом блока.
55
+
- Для файла с 30 к строк:
56
+
Было: 1.076115 s
57
+
Стало: 0.349385 s
58
+
- Проблема перестала быть точкой роста
47
59
48
60
## Результаты
49
61
В результате проделанной оптимизации наконец удалось обработать файл с данными.
50
-
Удалось улучшить метрику системы с *того, что у вас было в начале, до того, что получилось в конце* и уложиться в заданный бюджет.
62
+
Удалось улучшить метрику системы с 66 секунд для файла с 30к строк до 0.3 секунд и уложиться в заданный бюджет.
51
63
52
64
*Какими ещё результами можете поделиться*
53
65
54
66
## Защита от регрессии производительности
55
-
Для защиты от потери достигнутого прогресса при дальнейших изменениях программы *о performance-тестах, которые вы написали*
67
+
Для защиты от потери достигнутого прогресса при дальнейших изменениях программы был написан perfomance тест для файла с 30к строк.
0 commit comments