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.md
+33-44Lines changed: 33 additions & 44 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -12,68 +12,57 @@
12
12
Я решил исправить эту проблему, оптимизировав эту программу.
13
13
14
14
## Формирование метрики
15
-
Для того, чтобы понимать, дают ли мои изменения положительный эффект на быстродействие программы я придумал использовать такую метрику: *тут ваша метрика*
15
+
Для того, чтобы понимать, дают ли мои изменения положительный эффект на быстродействие программы я придумал использовать такую метрику:
16
+
Время выполнения программы.
16
17
17
18
## Гарантия корректности работы оптимизированной программы
18
19
Программа поставлялась с тестом. Выполнение этого теста в фидбек-лупе позволяет не допустить изменения логики программы при оптимизации.
19
20
20
21
## Feedback-Loop
21
22
Для того, чтобы иметь возможность быстро проверять гипотезы я выстроил эффективный `feedback-loop`, который позволил мне получать обратную связь по эффективности сделанных изменений за *время, которое у вас получилось*
22
23
23
-
Вот как я построил `feedback_loop`: *как вы построили feedback_loop*
24
+
Вот как я построил `feedback_loop`: создал файлы с различным количеством строк, чтобы программа могла выполняться за 10–20 секунд.
25
+
После каждого изменения я запускал программу на файлах с разным количеством строк и смотрел на результаты.
24
26
25
27
## Вникаем в детали системы, чтобы найти главные точки роста
26
-
Для того, чтобы найти "точки роста" для оптимизации я воспользовался *инструментами, которыми вы воспользовались*
28
+
Для того, чтобы найти "точки роста" для оптимизации я воспользовался:
29
+
- gem ruby-prof и отчеты callstack & qcachegrind
27
30
28
-
Вот какие проблемы удалось найти и решить
31
+
Вот какие проблемы удалось найти и решить:
29
32
30
-
### Ваша находка №1
31
-
- какой отчёт показал главную точку роста
32
-
- как вы решили её оптимизировать
33
-
- как изменилась метрика
34
-
- как изменился отчёт профилировщика - исправленная проблема перестала быть главной точкой роста?
35
-
36
-
### Ваша находка №2
37
-
- какой отчёт показал главную точку роста
38
-
- как вы решили её оптимизировать
39
-
- как изменилась метрика
40
-
- как изменился отчёт профилировщика - исправленная проблема перестала быть главной точкой роста?
41
-
42
-
### Ваша находка №X
43
-
- какой отчёт показал главную точку роста
44
-
- как вы решили её оптимизировать
45
-
- как изменилась метрика
46
-
- как изменился отчёт профилировщика - исправленная проблема перестала быть главной точкой роста?
47
-
48
-
## Результаты
49
-
В результате проделанной оптимизации наконец удалось обработать файл с данными.
50
-
Удалось улучшить метрику системы с *того, что у вас было в начале, до того, что получилось в конце* и уложиться в заданный бюджет.
51
-
52
-
*Какими ещё результами можете поделиться*
53
-
54
-
## Защита от регрессии производительности
55
-
Для защиты от потери достигнутого прогресса при дальнейших изменениях программы *о performance-тестах, которые вы написали*
56
-
57
-
58
-
59
-
Добавил прогресс бары
60
-
61
-
### находка №1 Многократная итерация объекта sessions для создания users_objects
33
+
### находка №1 Многократная итерация объекта sessions для создания users_objects
62
34
- callstack из ruby-prof
63
-
- одной итерацией собрать необходимые данные в объекте sessions_by_user
64
-
- время выполнения приложения на 15т строк сократилась 7.5 секунд до 0.9 секунд
65
-
- исправленная проблема перестала быть главной точкой роста
66
-
35
+
- Одной итерацией собрать необходимые данные в объекте sessions_by_user
36
+
- Время выполнения приложения на 15т строк сократилась 7.5 секунд до 0.9 секунд
37
+
- Исправленная проблема перестала быть главной точкой роста
67
38
68
39
### находка №2 Неэффективный алгоритм с многократными проверками для сбора unique_browsers.
69
40
- callstack из ruby-prof
70
41
- Было принято решение заменить неэффективный алгоритм с многократными проверками на более оптимизированное решение, использующее встроенные методы Ruby
71
-
-время выполнения приложения на 15т строк сократилась 0.9 секунд до 0.6 секунд
72
-
-исправленная проблема перестала быть главной точкой роста
42
+
-Время выполнения приложения на 15т строк сократилась 0.9 секунд до 0.6 секунд
43
+
-Исправленная проблема перестала быть главной точкой роста
73
44
74
45
### Находка №3: Неэффективное добавление элементов в массивы с использованием оператора конкатенации
75
46
- callstack из ruby-prof
76
47
- Было принято решение заменить неэффективное добавление элементов в массивы с помощью оператора + на использование метода << (shovel operator). Дополнительно была применена конструкция case для улучшения читаемости и производительности.
77
48
Время выполнения: точные измерения не предоставлены, но ожидается значительное улучшение производительности, особенно для больших наборов данных. Операция << имеет сложность O(1), тогда как + создает новый массив при каждой итерации, что имеет сложность O(n).
78
-
- время выполнения приложения на 15т строк сократилась 0.6 секунд до 0.5 секунд
79
-
- исправленная проблема перестала быть главной точкой роста
49
+
- Время выполнения приложения на 15т строк сократилась 0.6 секунд до 0.5 секунд
50
+
- Исправленная проблема перестала быть главной точкой роста
51
+
52
+
### Находка №4: Избыточный парсинг дат и преобразование в формат iso8601
53
+
- callstack из ruby-prof
54
+
- Так как мы уже имеем данные в нужном формате, то было принято решение не тратить время на преобразование даты в формат iso8601
55
+
- Исправленная проблема перестала быть главной точкой роста
56
+
57
+
### Находка №5: Избыточное использование хешей для представления сессий
58
+
- callstack из ruby-prof
59
+
- Анализ профилировщика показал, что создание и обработка хешей в методе parse_session занимают значительное время, особенно при большом количестве сессий. Это связано с накладными расходами на создание объектов хешей и доступ к их ключам.
60
+
- Было принято решение заменить использование хешей на Struct для представления сессий. Struct предоставляет более легковесную и быструю структуру для хранения данных с фиксированными ключами, что уменьшает время создания объектов и ускоряет доступ к их атрибутам.
61
+
- Исправленная проблема перестала быть главной точкой роста. Данные начали обрабатываться быстрее и укладываться в бюджет времени.
62
+
63
+
## Результаты
64
+
В результате проделанной оптимизации наконец удалось обработать файл с данными.
65
+
Удалось улучшить метрику системы с более чем 15 минут обработки файла до 30 секунд и уложиться в заданный бюджет.
66
+
67
+
## Защита от регрессии производительности
68
+
Для защиты от потери достигнутого прогресса при дальнейших изменениях программы я написал performance_test.rb.
0 commit comments