Skip to content

Commit 48d69d4

Browse files
author
aleksey.ryabchikov
committed
loop_4
1 parent 65dbbab commit 48d69d4

File tree

3 files changed

+36
-45
lines changed

3 files changed

+36
-45
lines changed

case-study.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,13 @@
6969
- При прогоне теста, среднее значение метрики упало с 0.25 сек. до 0.18 сек.
7070

7171
### Ваша находка №4
72-
- По какой-то причине показания stackprof и ruby-prof стали расходится.
73-
- stackprof указал на главную точку роста в строке `{ 'dates' => user.sessions.map{|s| s['date']}.map {|d| Date.parse(d)}.sort.reverse.map { |d| d.iso8601 } }`
74-
- ruby-prof указал на строку `{ 'totalTime' => user.sessions.map {|s| s['time']}.map {|t| t.to_i}.sum.to_s + ' min.' }`
72+
- Попробовал увеличить кол-во данных, чтобы проще было увидеть проблематику до 100_000 строк.
73+
- По отчетам нашел новую точку роста, это метод `collect_stats_from_users`, он аффектит на два проблемных места сразу
7574
```
7675
%Total %Self Total Self Wait Child Calls Name
77-
90.29% 21.60% 0.37 0.09 0.00 0.28 10 Array#each
76+
89.28% 23.89% 1.43 0.38 0.00 1.05 10 Array#each
7877
```
79-
- Попробовал увеличить кол-во данных, чтобы проще было увидеть проблематику до 100_000 строк.
80-
- Изучив код более подробно, понял, что обе точки роста связаны между собой.
78+
- Оптимизировал, а именно избавился от collect_stats_from_users и начал подготавливать данные за один проход.
79+
- При прогоне теста, среднее значение метрики упало с 0.18 сек. до 0.14 сек. на 20_000 строк.
8180

8281

spec/task-1_spec.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@
3030

3131
describe 'with partial file' do
3232
it 'works under 0.4 sec' do
33-
expect { work(file) }.to perform_under(0.18).sec.warmup(2).times.sample(10).times
33+
expect { work(file) }.to perform_under(0.14).sec.warmup(2).times.sample(10).times
3434
end
3535
end
3636

37-
describe 'with full file' do
38-
it 'works under 30 sec' do
39-
expect { work('./data_large.txt') }.to perform_under(30).sec
40-
end
41-
end
37+
# describe 'with full file' do
38+
# it 'works under 30 sec' do
39+
# expect { work('./data_large.txt') }.to perform_under(30).sec
40+
# end
41+
# end
4242
end
4343
end

task-1.rb

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -101,39 +101,31 @@ def work(file_path, result_path = 'spec/fixtures/files/result.json')
101101

102102
report['usersStats'] = {}
103103

104-
# Собираем количество сессий по пользователям
105-
collect_stats_from_users(report, users_objects) do |user|
106-
{ 'sessionsCount' => user.sessions.count }
107-
end
108-
109-
# Собираем количество времени по пользователям
110-
collect_stats_from_users(report, users_objects) do |user|
111-
{ 'totalTime' => user.sessions.map {|s| s['time']}.map {|t| t.to_i}.sum.to_s + ' min.' }
112-
end
113-
114-
# Выбираем самую длинную сессию пользователя
115-
collect_stats_from_users(report, users_objects) do |user|
116-
{ 'longestSession' => user.sessions.map {|s| s['time']}.map {|t| t.to_i}.max.to_s + ' min.' }
117-
end
118-
119-
# Браузеры пользователя через запятую
120-
collect_stats_from_users(report, users_objects) do |user|
121-
{ 'browsers' => user.sessions.map {|s| s['browser']}.map {|b| b.upcase}.sort.join(', ') }
122-
end
123-
124-
# Хоть раз использовал IE?
125-
collect_stats_from_users(report, users_objects) do |user|
126-
{ 'usedIE' => user.sessions.map{|s| s['browser']}.any? { |b| b.upcase =~ /INTERNET EXPLORER/ } }
127-
end
128-
129-
# Всегда использовал только Chrome?
130-
collect_stats_from_users(report, users_objects) do |user|
131-
{ 'alwaysUsedChrome' => user.sessions.map{|s| s['browser']}.all? { |b| b.upcase =~ /CHROME/ } }
132-
end
133-
134-
# Даты сессий через запятую в обратном порядке в формате iso8601
135-
collect_stats_from_users(report, users_objects) do |user|
136-
{ 'dates' => user.sessions.map{|s| s['date']}.map {|d| Date.parse(d)}.sort.reverse.map { |d| d.iso8601 } }
104+
users_objects.each do |user|
105+
user_key = "#{user.attributes['first_name']} #{user.attributes['last_name']}"
106+
107+
# Подготовим данные для сессий
108+
sessions = user.sessions
109+
times = sessions.map { |s| s['time'].to_i }
110+
browsers = sessions.map { |s| s['browser'].upcase }
111+
dates = sessions.map { |s| Date.parse(s['date']) }
112+
113+
report['usersStats'][user_key] = {
114+
# Количество сессий
115+
'sessionsCount' => sessions.count,
116+
# Общее время
117+
'totalTime' => "#{times.sum} min.",
118+
# Самая длинная сессия
119+
'longestSession' => "#{times.max} min.",
120+
# Браузеры через запятую
121+
'browsers' => browsers.sort.join(', '),
122+
# Хоть раз использовал IE?
123+
'usedIE' => browsers.any? { |b| b.include?('INTERNET EXPLORER') },
124+
# Всегда использовал только Chrome?
125+
'alwaysUsedChrome' => browsers.all? { |b| b.include?('CHROME') },
126+
# Даты сессий через запятую в обратном порядке в формате iso8601
127+
'dates' => dates.sort.reverse.map(&:iso8601)
128+
}
137129
end
138130

139131
File.write(result_path, "#{report.to_json}\n")

0 commit comments

Comments
 (0)