Skip to content

Commit 4cc6a1c

Browse files
NikitaNikita
authored andcommitted
[Second] optimize date parsing
1 parent 5e2deec commit 4cc6a1c

File tree

9 files changed

+1981
-1494
lines changed

9 files changed

+1981
-1494
lines changed

main.rb

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ def work
2626
user_sessions = {}
2727

2828
file_lines.each do |line|
29-
cols = line.split(',')
30-
users << parse_user(line) if cols[0] == 'user'
31-
if cols[0] == 'session'
32-
session = parse_session(line)
29+
fields = line.split(',')
30+
users << parse_user(fields) if fields[0] == 'user'
31+
if fields[0] == 'session'
32+
session = parse_session(fields)
3333
user_sessions[session['user_id']] = (user_sessions[session['user_id']] || []) << session
3434
sessions << session
3535
end
@@ -70,13 +70,8 @@ def work
7070
.join(',')
7171

7272
# Статистика по пользователям
73-
users_objects = []
7473

75-
users.each do |user|
76-
attributes = user
77-
user_object = User.new(attributes: attributes, sessions: user_sessions[user['id']])
78-
users_objects << user_object
79-
end
74+
users_objects = users.map { |user| User.new(attributes: user, sessions: user_sessions[user['id']]) }
8075

8176
report['usersStats'] = {}
8277

@@ -112,25 +107,23 @@ def work
112107

113108
# Даты сессий через запятую в обратном порядке в формате iso8601
114109
collect_stats_from_users(report, users_objects) do |user|
115-
{ 'dates' => user.sessions.map{|s| s['date']}.map {|d| Date.parse(d)}.sort.reverse.map { |d| d.iso8601 } }
110+
{ 'dates' => user.sessions.map{|s| s['date']}.map {|d| Date.strptime(d, '%Y-%m-%d')}.sort.reverse.map { |d| d.iso8601 } }
116111
end
117112

118113
File.write('result.json', "#{report.to_json}\n")
119114
end
120115

121-
def parse_user(user)
122-
fields = user.split(',')
123-
parsed_result = {
116+
def parse_user(fields)
117+
{
124118
'id' => fields[1],
125119
'first_name' => fields[2],
126120
'last_name' => fields[3],
127121
'age' => fields[4],
128122
}
129123
end
130124

131-
def parse_session(session)
132-
fields = session.split(',')
133-
parsed_result = {
125+
def parse_session(fields)
126+
{
134127
'user_id' => fields[1],
135128
'session_id' => fields[2],
136129
'browser' => fields[3],
@@ -141,7 +134,7 @@ def parse_session(session)
141134

142135
def collect_stats_from_users(report, users_objects, &block)
143136
users_objects.each do |user|
144-
user_key = "#{user.attributes['first_name']}" + ' ' + "#{user.attributes['last_name']}"
137+
user_key = "#{user.attributes['first_name']} #{user.attributes['last_name']}"
145138
report['usersStats'][user_key] ||= {}
146139
report['usersStats'][user_key] = report['usersStats'][user_key].merge(block.call(user))
147140
end

measurer.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def call
1212
end
1313

1414
# Zero iteration:
15-
# 120_000 - 1.04
16-
# 500_000 - 4.81
17-
# 2_000_000 - 4.57
18-
# full - 36.7
15+
# 120_000 - 0.75
16+
# 500_000 - 3.34
17+
# 2_000_000 - 3.35
18+
# full - 24.58
Lines changed: 78 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,88 +1,95 @@
11
----------------------------------------------------
2-
Thread ID: 32720
3-
Fiber ID: 32700
4-
Total Time: 207.973784976999
2+
Thread ID: 5720
3+
Fiber ID: 5700
4+
Total Time: 52.789387451997754
55
Sort by:
66

7-
Profiler#profile_by_ruby_prof (tt:207.97, st:0.00, wt:0.00, ct:207.97, call:1, )
8-
Profiler#action (tt:207.97, st:0.00, wt:0.00, ct:207.97, call:1, )
7+
Profiler#profile_by_ruby_prof (tt:52.79, st:0.00, wt:0.00, ct:52.79, call:1, )
8+
Profiler#action (tt:52.79, st:0.00, wt:0.00, ct:52.79, call:1, )
99
Profiler#count_lines (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
1010
Class#new (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
1111
Main#initialize (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
1212
Hash#[] (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:3, )
13-
Main#call (tt:207.97, st:0.00, wt:0.00, ct:207.97, call:1, )
13+
Main#call (tt:52.79, st:0.00, wt:0.00, ct:52.79, call:1, )
1414
Main#with_gc (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
15-
Main#work (tt:207.30, st:1.37, wt:0.00, ct:205.92, call:1, )
15+
Main#work (tt:51.88, st:0.17, wt:0.00, ct:51.71, call:1, )
1616
Main#count_lines (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:3, )
1717
Main#source_file_name (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
18-
Kernel#` (tt:0.23, st:0.23, wt:0.00, ct:0.00, call:1, )
19-
<Class::IO>#read (tt:0.07, st:0.07, wt:0.00, ct:0.00, call:1, )
20-
String#split (tt:0.47, st:0.47, wt:0.00, ct:0.00, call:1, )
21-
Array#each (tt:153.46, st:7.85, wt:0.00, ct:145.61, call:3, )
22-
String#split (tt:4.99, st:4.99, wt:0.00, ct:0.00, call:3250940, )
23-
Array#[] (tt:0.64, st:0.64, wt:0.00, ct:0.00, call:6501880, )
24-
String#== (tt:0.68, st:0.68, wt:0.00, ct:0.00, call:6501880, )
25-
Main#parse_user (tt:1.43, st:0.53, wt:0.00, ct:0.89, call:500000, )
26-
String#split (tt:0.70, st:0.70, wt:0.00, ct:0.00, call:500000, )
27-
Array#[] (tt:0.19, st:0.19, wt:0.00, ct:0.00, call:2000000, )
28-
Array#<< (tt:0.80, st:0.80, wt:0.00, ct:0.00, call:6501880, )
29-
Main#parse_session (tt:8.15, st:3.86, wt:0.00, ct:4.28, call:2750940, )
30-
String#split (tt:2.98, st:2.98, wt:0.00, ct:0.00, call:2750940, )
31-
Array#[] (tt:1.31, st:1.31, wt:0.00, ct:0.00, call:13754700, )
32-
Hash#[] (tt:0.81, st:0.81, wt:0.00, ct:0.00, call:3250940, )
33-
Hash#[]= (tt:0.67, st:0.67, wt:0.00, ct:0.00, call:2750940, )
34-
Array#all? (tt:127.03, st:52.31, wt:0.00, ct:74.72, call:2750940, )
35-
BasicObject#!= (tt:74.72, st:48.89, wt:0.00, ct:25.83, call:276615383, )
36-
String#== (tt:25.83, st:25.83, wt:0.00, ct:0.00, call:276615383, )
37-
Array#+ (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:200, )
38-
Class#new (tt:0.43, st:0.30, wt:0.00, ct:0.13, call:500000, )
39-
User#initialize (tt:0.13, st:0.13, wt:0.00, ct:0.00, call:500000, )
40-
Array#count (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:3, )
18+
Kernel#` (tt:0.19, st:0.19, wt:0.00, ct:0.00, call:1, )
19+
<Class::IO>#read (tt:0.06, st:0.06, wt:0.00, ct:0.00, call:1, )
20+
String#split (tt:0.26, st:0.26, wt:0.00, ct:0.00, call:1, )
21+
Array#each (tt:17.46, st:5.43, wt:0.00, ct:12.03, call:1, )
22+
String#split (tt:5.21, st:5.21, wt:0.00, ct:0.00, call:3250940, )
23+
Array#[] (tt:0.58, st:0.58, wt:0.00, ct:0.00, call:6501880, )
24+
String#== (tt:0.63, st:0.63, wt:0.00, ct:0.00, call:6501880, )
25+
Main#parse_user (tt:0.50, st:0.33, wt:0.00, ct:0.17, call:500000, )
26+
Array#[] (tt:0.17, st:0.17, wt:0.00, ct:0.00, call:2000000, )
27+
Array#<< (tt:0.69, st:0.69, wt:0.00, ct:0.00, call:6001880, )
28+
Main#parse_session (tt:3.30, st:2.13, wt:0.00, ct:1.17, call:2750940, )
29+
Array#[] (tt:1.17, st:1.17, wt:0.00, ct:0.00, call:13754700, )
30+
Hash#[] (tt:0.49, st:0.49, wt:0.00, ct:0.00, call:2750940, )
31+
Hash#[]= (tt:0.63, st:0.63, wt:0.00, ct:0.00, call:2750940, )
32+
Array#count (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:2, )
4133
Hash#[]= (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
42-
Array#map (tt:1.58, st:1.17, wt:0.00, ct:0.41, call:2, )
43-
String#upcase (tt:0.41, st:0.41, wt:0.00, ct:0.00, call:2750940, )
44-
Array#sort (tt:1.27, st:1.27, wt:0.00, ct:0.00, call:1, )
45-
Array#uniq (tt:0.41, st:0.41, wt:0.00, ct:0.00, call:1, )
34+
Array#map (tt:2.62, st:1.78, wt:0.00, ct:0.84, call:4, )
35+
String#upcase (tt:0.38, st:0.38, wt:0.00, ct:0.00, call:2750940, )
36+
Hash#[] (tt:0.19, st:0.19, wt:0.00, ct:0.00, call:500000, )
37+
Class#new (tt:0.27, st:0.17, wt:0.00, ct:0.11, call:500000, )
38+
User#initialize (tt:0.11, st:0.11, wt:0.00, ct:0.00, call:500000, )
39+
Enumerable#to_set (tt:1.95, st:0.00, wt:0.00, ct:1.95, call:1, )
40+
Class#new (tt:1.95, st:0.00, wt:0.00, ct:1.95, call:1, )
41+
Set#initialize (tt:1.95, st:0.00, wt:0.00, ct:1.95, call:1, )
42+
Class#new (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
43+
Hash#initialize (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
44+
Kernel#nil? (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
45+
Set#merge (tt:1.95, st:0.00, wt:0.00, ct:1.95, call:1, )
46+
Array#each (tt:1.95, st:0.00, wt:0.00, ct:1.95, call:1, )
47+
Kernel#class (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
48+
Kernel#instance_of? (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
49+
Set#do_with_enum (tt:1.95, st:0.00, wt:0.00, ct:1.95, call:1, )
50+
Kernel#respond_to? (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
51+
Enumerable#each_entry (tt:1.95, st:0.00, wt:0.00, ct:1.95, call:1, )
52+
Array#each (tt:1.95, st:0.60, wt:0.00, ct:1.35, call:1, )
53+
Set#add (tt:1.35, st:0.81, wt:0.00, ct:0.54, call:2750940, )
54+
Hash#[]= (tt:0.54, st:0.54, wt:0.00, ct:0.00, call:2750940, )
55+
Enumerable#count (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
56+
Set#each (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
57+
Kernel#block_given? (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
58+
Hash#each_key (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
59+
Array#sort (tt:1.09, st:1.09, wt:0.00, ct:0.00, call:1, )
60+
Array#uniq (tt:1.30, st:1.30, wt:0.00, ct:0.00, call:1, )
4661
Array#join (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
47-
String#eql? (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
48-
Main#collect_stats_from_users (tt:47.24, st:0.00, wt:0.00, ct:47.24, call:7, )
49-
Array#each (tt:47.24, st:10.69, wt:0.00, ct:36.55, call:7, )
50-
User#attributes (tt:0.86, st:0.86, wt:0.00, ct:0.00, call:7000000, )
51-
String#+ (tt:1.37, st:1.37, wt:0.00, ct:0.00, call:8000000, )
52-
String#eql? (tt:1.05, st:1.05, wt:0.00, ct:0.00, call:10500000, )
53-
Hash#[] (tt:2.02, st:2.02, wt:0.00, ct:0.00, call:7000000, )
54-
Hash#[]= (tt:0.90, st:0.90, wt:0.00, ct:0.00, call:3992465, )
55-
User#sessions (tt:0.46, st:0.46, wt:0.00, ct:0.00, call:3500000, )
56-
Array#count (tt:0.06, st:0.06, wt:0.00, ct:0.00, call:500000, )
57-
Hash#merge (tt:0.92, st:0.92, wt:0.00, ct:0.00, call:3500000, )
58-
Array#map (tt:23.47, st:7.69, wt:0.00, ct:15.78, call:5500000, )
59-
String#to_i (tt:0.69, st:0.69, wt:0.00, ct:0.00, call:5501880, )
60-
String#upcase (tt:0.44, st:0.44, wt:0.00, ct:0.00, call:2750940, )
61-
<Class::Date>#parse (tt:13.63, st:7.46, wt:0.00, ct:6.18, call:2750940, )
62-
String#gsub! (tt:1.50, st:1.50, wt:0.00, ct:0.00, call:2750940, )
63-
Regexp#match (tt:2.06, st:2.06, wt:0.00, ct:0.00, call:5501880, )
64-
MatchData#begin (tt:1.51, st:1.51, wt:0.00, ct:0.00, call:2750940, )
65-
MatchData#end (tt:0.30, st:0.30, wt:0.00, ct:0.00, call:2750940, )
66-
String#[]= (tt:0.50, st:0.50, wt:0.00, ct:0.00, call:2750940, )
67-
Integer#div (tt:0.31, st:0.31, wt:0.00, ct:0.00, call:2750940, )
68-
Date#iso8601 (tt:1.02, st:1.02, wt:0.00, ct:0.00, call:2750940, )
62+
Main#collect_stats_from_users (tt:26.12, st:0.00, wt:0.00, ct:26.12, call:7, )
63+
Array#each (tt:26.12, st:7.00, wt:0.00, ct:19.12, call:7, )
64+
User#attributes (tt:0.67, st:0.67, wt:0.00, ct:0.00, call:7000000, )
65+
Hash#[] (tt:1.57, st:1.57, wt:0.00, ct:0.00, call:7000000, )
66+
Hash#[]= (tt:0.77, st:0.77, wt:0.00, ct:0.00, call:3992465, )
67+
User#sessions (tt:0.34, st:0.34, wt:0.00, ct:0.00, call:3500000, )
68+
Array#count (tt:0.05, st:0.05, wt:0.00, ct:0.00, call:500000, )
69+
Hash#merge (tt:0.85, st:0.85, wt:0.00, ct:0.00, call:3500000, )
70+
Array#map (tt:10.85, st:6.72, wt:0.00, ct:4.13, call:5500000, )
71+
String#to_i (tt:0.64, st:0.64, wt:0.00, ct:0.00, call:5501880, )
72+
String#upcase (tt:0.39, st:0.39, wt:0.00, ct:0.00, call:2750940, )
73+
<Class::Date>#strptime (tt:2.28, st:2.03, wt:0.00, ct:0.25, call:2750940, )
74+
Integer#div (tt:0.25, st:0.25, wt:0.00, ct:0.00, call:2750940, )
75+
Date#iso8601 (tt:0.83, st:0.83, wt:0.00, ct:0.00, call:2750940, )
6976
Array#sum (tt:0.06, st:0.06, wt:0.00, ct:0.00, call:500000, )
70-
Integer#to_s (tt:0.16, st:0.16, wt:0.00, ct:0.00, call:1000000, )
77+
Integer#to_s (tt:0.22, st:0.22, wt:0.00, ct:0.00, call:1000000, )
78+
String#+ (tt:0.20, st:0.20, wt:0.00, ct:0.00, call:1000000, )
7179
Array#max (tt:0.06, st:0.06, wt:0.00, ct:0.00, call:500000, )
72-
Array#sort (tt:1.65, st:1.00, wt:0.00, ct:0.65, call:1000000, )
73-
Date#<=> (tt:0.65, st:0.65, wt:0.00, ct:0.00, call:4784430, )
74-
Array#join (tt:1.49, st:1.49, wt:0.00, ct:0.00, call:500000, )
75-
Array#any? (tt:1.30, st:0.63, wt:0.00, ct:0.67, call:500000, )
76-
String#upcase (tt:0.22, st:0.22, wt:0.00, ct:0.00, call:1431949, )
77-
String#=~ (tt:0.45, st:0.45, wt:0.00, ct:0.00, call:1431949, )
78-
Array#all? (tt:0.61, st:0.30, wt:0.00, ct:0.31, call:500000, )
79-
String#upcase (tt:0.11, st:0.11, wt:0.00, ct:0.00, call:643788, )
80-
String#=~ (tt:0.19, st:0.19, wt:0.00, ct:0.00, call:643788, )
81-
Array#reverse (tt:0.13, st:0.13, wt:0.00, ct:0.00, call:500000, )
82-
JSON::Ext::Generator::GeneratorMethods::Hash#to_json (tt:1.10, st:0.76, wt:0.00, ct:0.34, call:1, )
80+
Array#sort (tt:1.39, st:0.83, wt:0.00, ct:0.56, call:1000000, )
81+
Date#<=> (tt:0.56, st:0.56, wt:0.00, ct:0.00, call:4784430, )
82+
Array#join (tt:0.21, st:0.21, wt:0.00, ct:0.00, call:500000, )
83+
Array#any? (tt:1.26, st:0.52, wt:0.00, ct:0.74, call:500000, )
84+
String#upcase (tt:0.21, st:0.21, wt:0.00, ct:0.00, call:1431949, )
85+
String#=~ (tt:0.54, st:0.54, wt:0.00, ct:0.00, call:1431949, )
86+
Array#all? (tt:0.56, st:0.26, wt:0.00, ct:0.30, call:500000, )
87+
String#upcase (tt:0.09, st:0.09, wt:0.00, ct:0.00, call:643788, )
88+
String#=~ (tt:0.21, st:0.21, wt:0.00, ct:0.00, call:643788, )
89+
Array#reverse (tt:0.07, st:0.07, wt:0.00, ct:0.00, call:500000, )
90+
JSON::Ext::Generator::GeneratorMethods::Hash#to_json (tt:0.56, st:0.56, wt:0.00, ct:0.00, call:1, )
8391
JSON::Ext::Generator::State#initialize (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
84-
String#eql? (tt:0.34, st:0.34, wt:0.00, ct:0.00, call:1, )
85-
<Class::IO>#write (tt:0.10, st:0.10, wt:0.00, ct:0.00, call:1, )
86-
<Module::GC>#start (tt:0.67, st:0.67, wt:0.00, ct:0.00, call:1, )
92+
<Class::IO>#write (tt:0.12, st:0.12, wt:0.00, ct:0.00, call:1, )
93+
<Module::GC>#start (tt:0.90, st:0.90, wt:0.00, ct:0.00, call:1, )
8794

8895

0 commit comments

Comments
 (0)