Skip to content

Commit cdd62a0

Browse files
committed
chore: add profiler files
1 parent d118968 commit cdd62a0

File tree

15 files changed

+103
-30
lines changed

15 files changed

+103
-30
lines changed

.gitignore

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
result.json
2+
data*.txt
3+
4+
/tmp/*
5+
!/tmp/.keep
6+
!/tmp/ruby_prof/.keep
7+
!/tmp/stackprof/.keep
8+
9+
# Ignore MacOS system files
10+
.DS_Store

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ head -n N data_large.txt > dataN.txt # create smaller file from larger (take N f
9797
- [x] Прикинуть зависимость времени работы програмы от размера обрабатываемого файла
9898
- [x] Построить и проанализировать отчёт `ruby-prof` в режиме `Flat`;
9999
- [x] Построить и проанализировать отчёт `ruby-prof` в режиме `Graph`;
100-
- [ ] Построить и проанализировать отчёт `ruby-prof` в режиме `CallStack`;
100+
- [x] Построить и проанализировать отчёт `ruby-prof` в режиме `CallStack`;
101101
- [ ] Построить и проанализировать отчёт `ruby-prof` в режиме `CallTree` c визуализацией в `QCachegrind`;
102102
- [x] Построить дамп `stackprof` и проанализировать его с помощью `CLI`
103103
- [x] Построить дамп `stackprof` в `json` и проанализировать его с помощью `speedscope.app`

case-study.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,19 @@
6969
### Находка №5
7070
- `ruby-prof` в режиме `Graph` показывает, что точкой роста является `27.07% 16.32% 3.99 2.41 0.00 1.58 846230 <Class::Date>#parse`, это строка `user.sessions.map{|s| s['date']}.map {|d| Date.parse(d)}.sort.reverse.map { |d| d.iso8601 }`
7171
- вместо `Date.parse(d)` используем `Date.strptime(d, '%Y-%m-%d')` (заранее известен формат). Даты часто повторяются, используем мемоизацию для уже распаршенных дат.
72-
- время выполнения программы для 1кк входных данных сократилось с 10с до с 7.7c
72+
- время выполнения программы для 1кк входных данных сократилось с 10с до с 7.8c
73+
- исправленная проблема перестала быть главной точкой роста.
74+
75+
### Находка №6
76+
- `ruby-prof` в режиме `CallStack` показывает, что точкой роста является `7.20% (15.82%) Array#include? [846230 calls, 846230 total]`
77+
- вместо формирования уникальных браузеров через each, сделаем `uniqueBrowsers = sessions.map { |session| session['browser'] }.uniq`.
78+
- время выполнения программы для 1кк входных данных сократилось с 7.8 до с 7.3c
79+
- исправленная проблема перестала быть главной точкой роста.
80+
81+
### Находка №7
82+
- `ruby-prof` в режиме `CallStack` показывает, что точкой роста является `2.22% (14.64%) String#upcase [846230 calls, 2331849 total]` в контексте `45.05% (45.05%) Object#collect_stats_from_users`
83+
- вместо фомирования `upcase` версий браузеров трижды для каждого юзера, сделаем это единожды в начале итерации: `upcased_browsers = user.sessions.map{|s| s['browser'].upcase }` и далее будем переиспользовать этот результат.
84+
- время выполнения программы для 1кк входных данных сократилось с 7.3 до с 6.9c
7385
- исправленная проблема перестала быть главной точкой роста.
7486

7587
## Результаты

data.txt

Lines changed: 0 additions & 18 deletions
This file was deleted.

rbspy/record.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#!/bin/sh
2+
ruby work.rb | ps aux | grep work.rb | grep -v grep | awk '{print $2}' | xargs sudo rbspy record --pid

ruby_prof/call_grind.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
require_relative '../task-1'
2+
3+
require 'ruby-prof'
4+
5+
RubyProf.measure_mode = RubyProf::WALL_TIME
6+
7+
result = RubyProf.profile do
8+
GC.disable
9+
work
10+
end
11+
printer = RubyProf::CallTreePrinter.new(result)
12+
printer.print(path: 'tmp/ruby_prof', profile: 'callgrind')

ruby_prof/call_stack.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
require_relative '../task-1'
2+
3+
require 'ruby-prof'
4+
5+
RubyProf.measure_mode = RubyProf::WALL_TIME
6+
7+
result = RubyProf.profile do
8+
GC.disable
9+
work
10+
end
11+
printer = RubyProf::CallStackPrinter.new(result)
12+
printer.print(File.open("tmp/ruby_prof/callstack_#{Time.now.to_i}.html", 'w+'))

ruby_prof/flat.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
require_relative '../task-1'
2+
3+
require 'ruby-prof'
4+
5+
RubyProf.measure_mode = RubyProf::WALL_TIME
6+
7+
result = RubyProf.profile do
8+
GC.disable
9+
work
10+
end
11+
printer = RubyProf::FlatPrinter.new(result)
12+
printer.print(File.open("tmp/ruby_prof/flat_#{Time.now.to_i}.html", 'w+'))

ruby_prof/graph.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
require_relative '../task-1'
2+
3+
require 'ruby-prof'
4+
5+
RubyProf.measure_mode = RubyProf::WALL_TIME
6+
7+
result = RubyProf.profile do
8+
GC.disable
9+
work
10+
end
11+
printer = RubyProf::GraphHtmlPrinter.new(result)
12+
printer.print(File.open("tmp/ruby_prof/graph_#{Time.now.to_i}.html", 'w+'))

stackprof/cli.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
require_relative '../task-1'
2+
3+
require 'stackprof'
4+
5+
StackProf.run(mode: :wall, out: "tmp/stackprof/cli_#{Time.now.to_i}.dump", interval: 1000) do
6+
GC.disable
7+
work
8+
end

0 commit comments

Comments
 (0)