Skip to content

Commit 5b5ace3

Browse files
committed
optimization 1
1 parent 60344d7 commit 5b5ace3

File tree

2 files changed

+45
-24
lines changed

2 files changed

+45
-24
lines changed

case-study-template.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,26 @@
5454
## Защита от регрессии производительности
5555
Для защиты от потери достигнутого прогресса при дальнейших изменениях программы *о performance-тестах, которые вы написали*
5656

57+
58+
59+
Добавил прогресс бары
60+
61+
### находка №1 Многократная итерация объекта sessions для создания users_objects
62+
- callstack из ruby-prof
63+
- одной итерацией собрать необходимые данные в объекте sessions_by_user
64+
- время выполнения приложения на 15т строк сократилась 7.5 секунд до 0.9 секунд
65+
- исправленная проблема перестала быть главной точкой роста
66+
67+
68+
### находка №2 Неэффективный алгоритм с многократными проверками для сбора unique_browsers.
69+
- callstack из ruby-prof
70+
- Было принято решение заменить неэффективный алгоритм с многократными проверками на более оптимизированное решение, использующее встроенные методы Ruby
71+
- время выполнения приложения на 15т строк сократилась 0.9 секунд до 0.6 секунд
72+
- исправленная проблема перестала быть главной точкой роста
73+
74+
### Находка №3: Неэффективное добавление элементов в массивы с использованием оператора конкатенации
75+
- callstack из ruby-prof
76+
- Было принято решение заменить неэффективное добавление элементов в массивы с помощью оператора + на использование метода << (shovel operator). Дополнительно была применена конструкция case для улучшения читаемости и производительности.
77+
Время выполнения: точные измерения не предоставлены, но ожидается значительное улучшение производительности, особенно для больших наборов данных. Операция << имеет сложность O(1), тогда как + создает новый массив при каждой итерации, что имеет сложность O(n).
78+
- время выполнения приложения на 15т строк сократилась 0.6 секунд до 0.5 секунд
79+
- исправленная проблема перестала быть главной точкой роста

task-1.rb

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
require 'pry'
55
require 'date'
66
require 'minitest/autorun'
7-
require 'ruby-progressbar'
87

98
class User
109
attr_reader :attributes, :sessions
@@ -44,19 +43,20 @@ def collect_stats_from_users(report, users_objects, &block)
4443
end
4544
end
4645

47-
def work
48-
file_lines = File.read('data.txt').split("\n")
46+
def work(file_name: "data.txt", disable_gc: false)
47+
GC.disable if disable_gc
48+
file_lines = File.read(file_name).split("\n")
4949

5050
users = []
5151
sessions = []
5252

53-
file_progressbar = ProgressBar.create(title: "Reading File", total: file_lines.count, format: '%t: |%B| %p%% %e')
54-
5553
file_lines.each do |line|
56-
cols = line.split(',')
57-
users = users + [parse_user(line)] if cols[0] == 'user'
58-
sessions = sessions + [parse_session(line)] if cols[0] == 'session'
59-
file_progressbar.increment
54+
case
55+
when line.start_with?('user,')
56+
users << parse_user(line)
57+
when line.start_with?('session,')
58+
sessions << parse_session(line)
59+
end
6060
end
6161

6262
# Отчёт в json
@@ -79,13 +79,9 @@ def work
7979
report[:totalUsers] = users.count
8080

8181
# Подсчёт количества уникальных браузеров
82-
uniqueBrowsers = []
83-
sessions.each do |session|
84-
browser = session['browser']
85-
uniqueBrowsers += [browser] if uniqueBrowsers.all? { |b| b != browser }
86-
end
82+
unique_browsers = sessions.map { |session| session['browser'] }.uniq
8783

88-
report['uniqueBrowsersCount'] = uniqueBrowsers.count
84+
report['uniqueBrowsersCount'] = unique_browsers.count
8985

9086
report['totalSessions'] = sessions.count
9187

@@ -98,16 +94,18 @@ def work
9894
.join(',')
9995

10096
# Статистика по пользователям
101-
users_objects = []
102-
103-
user_progressbar = ProgressBar.create(title: "Processing Users", total: users.count, format: '%t: |%B| %p%% %e')
97+
sessions_by_user = {}
98+
sessions.each do |session|
99+
user_id = session['user_id']
100+
sessions_by_user[user_id] ||= []
101+
sessions_by_user[user_id] << session
102+
end
104103

105-
users.each do |user|
106-
attributes = user
107-
user_sessions = sessions.select { |session| session['user_id'] == user['id'] }
108-
user_object = User.new(attributes: attributes, sessions: user_sessions)
109-
users_objects = users_objects + [user_object]
110-
user_progressbar.increment
104+
users_objects = users.map do |user|
105+
user_id = user['id']
106+
user_sessions = sessions_by_user[user_id] || []
107+
user_object = User.new(attributes: user, sessions: user_sessions)
108+
user_object
111109
end
112110

113111
report['usersStats'] = {}

0 commit comments

Comments
 (0)