ruby-prof 1.7.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/{CHANGES → CHANGELOG.md} +112 -178
- data/README.md +5 -5
- data/bin/ruby-prof +1 -4
- data/docs/advanced-usage.md +132 -0
- data/docs/alternatives.md +98 -0
- data/docs/architecture.md +122 -0
- data/docs/best-practices.md +27 -0
- data/docs/getting-started.md +130 -0
- data/docs/history.md +11 -0
- data/docs/index.md +45 -0
- data/docs/profiling-rails.md +64 -0
- data/docs/public/examples/example.rb +33 -0
- data/docs/public/examples/generate_reports.rb +92 -0
- data/docs/public/examples/reports/call_info.txt +27 -0
- data/docs/public/examples/reports/call_stack.html +835 -0
- data/docs/public/examples/reports/callgrind.out +150 -0
- data/docs/public/examples/reports/flame_graph.html +408 -0
- data/docs/public/examples/reports/flat.txt +45 -0
- data/docs/public/examples/reports/graph.dot +129 -0
- data/docs/public/examples/reports/graph.html +1319 -0
- data/docs/public/examples/reports/graph.txt +100 -0
- data/docs/public/examples/reports/graphviz_viewer.html +1 -0
- data/docs/public/images/call_stack.png +0 -0
- data/docs/public/images/class_diagram.png +0 -0
- data/docs/public/images/dot_printer.png +0 -0
- data/docs/public/images/flame_graph.png +0 -0
- data/docs/public/images/flat.png +0 -0
- data/docs/public/images/graph.png +0 -0
- data/docs/public/images/graph_html.png +0 -0
- data/docs/public/images/ruby-prof-logo.svg +1 -0
- data/docs/reports.md +150 -0
- data/docs/stylesheets/extra.css +80 -0
- data/ext/ruby_prof/rp_allocation.c +0 -15
- data/ext/ruby_prof/rp_allocation.h +29 -33
- data/ext/ruby_prof/rp_call_tree.c +3 -0
- data/ext/ruby_prof/rp_call_tree.h +1 -4
- data/ext/ruby_prof/rp_call_trees.h +1 -4
- data/ext/ruby_prof/rp_measurement.c +0 -5
- data/ext/ruby_prof/rp_measurement.h +49 -53
- data/ext/ruby_prof/rp_method.c +3 -0
- data/ext/ruby_prof/rp_method.h +1 -4
- data/ext/ruby_prof/rp_profile.c +1 -1
- data/ext/ruby_prof/rp_profile.h +1 -5
- data/ext/ruby_prof/rp_stack.h +50 -53
- data/ext/ruby_prof/rp_thread.h +1 -4
- data/ext/ruby_prof/ruby_prof.h +1 -4
- data/ext/ruby_prof/vc/ruby_prof.vcxproj +7 -8
- data/lib/ruby-prof/assets/call_stack_printer.html.erb +746 -711
- data/lib/ruby-prof/assets/flame_graph_printer.html.erb +412 -0
- data/lib/ruby-prof/assets/graph_printer.html.erb +355 -355
- data/lib/ruby-prof/call_tree.rb +57 -57
- data/lib/ruby-prof/call_tree_visitor.rb +36 -36
- data/lib/ruby-prof/measurement.rb +17 -17
- data/lib/ruby-prof/printers/abstract_printer.rb +19 -33
- data/lib/ruby-prof/printers/call_info_printer.rb +53 -53
- data/lib/ruby-prof/printers/call_stack_printer.rb +168 -180
- data/lib/ruby-prof/printers/call_tree_printer.rb +132 -145
- data/lib/ruby-prof/printers/dot_printer.rb +177 -132
- data/lib/ruby-prof/printers/flame_graph_printer.rb +79 -0
- data/lib/ruby-prof/printers/flat_printer.rb +52 -52
- data/lib/ruby-prof/printers/graph_html_printer.rb +62 -63
- data/lib/ruby-prof/printers/graph_printer.rb +112 -113
- data/lib/ruby-prof/printers/multi_printer.rb +134 -127
- data/lib/ruby-prof/profile.rb +13 -0
- data/lib/ruby-prof/rack.rb +114 -105
- data/lib/ruby-prof/task.rb +147 -147
- data/lib/ruby-prof/thread.rb +20 -20
- data/lib/ruby-prof/version.rb +1 -1
- data/lib/ruby-prof.rb +50 -52
- data/lib/unprof.rb +10 -10
- data/ruby-prof.gemspec +5 -5
- data/test/abstract_printer_test.rb +25 -27
- data/test/alias_test.rb +203 -117
- data/test/call_tree_builder.rb +126 -126
- data/test/call_tree_visitor_test.rb +27 -27
- data/test/call_trees_test.rb +66 -66
- data/test/duplicate_names_test.rb +32 -32
- data/test/dynamic_method_test.rb +50 -50
- data/test/exceptions_test.rb +24 -24
- data/test/exclude_threads_test.rb +48 -48
- data/test/fiber_test.rb +72 -72
- data/test/inverse_call_tree_test.rb +174 -174
- data/test/line_number_test.rb +138 -1
- data/test/marshal_test.rb +144 -145
- data/test/measure_allocations.rb +26 -26
- data/test/measure_allocations_test.rb +340 -1
- data/test/measure_process_time_test.rb +3098 -3142
- data/test/measure_times.rb +56 -56
- data/test/measure_wall_time_test.rb +511 -372
- data/test/measurement_test.rb +82 -82
- data/test/merge_test.rb +48 -48
- data/test/multi_printer_test.rb +52 -66
- data/test/no_method_class_test.rb +15 -15
- data/test/pause_resume_test.rb +171 -171
- data/test/prime.rb +54 -54
- data/test/prime_script.rb +5 -5
- data/test/printer_call_stack_test.rb +28 -27
- data/test/printer_call_tree_test.rb +30 -30
- data/test/printer_flame_graph_test.rb +82 -0
- data/test/printer_flat_test.rb +99 -99
- data/test/printer_graph_html_test.rb +62 -59
- data/test/printer_graph_test.rb +42 -40
- data/test/printers_test.rb +28 -44
- data/test/printing_recursive_graph_test.rb +81 -81
- data/test/profile_test.rb +101 -101
- data/test/rack_test.rb +103 -93
- data/test/recursive_test.rb +139 -139
- data/test/scheduler.rb +4 -0
- data/test/singleton_test.rb +39 -38
- data/test/stack_printer_test.rb +61 -61
- data/test/start_stop_test.rb +106 -106
- data/test/test_helper.rb +4 -0
- data/test/thread_test.rb +29 -29
- data/test/unique_call_path_test.rb +123 -123
- data/test/yarv_test.rb +56 -56
- metadata +53 -11
- data/ext/ruby_prof/rp_measure_memory.c +0 -46
- data/lib/ruby-prof/compatibility.rb +0 -113
- data/test/compatibility_test.rb +0 -49
- data/test/measure_memory_test.rb +0 -1193
data/test/printer_flat_test.rb
CHANGED
|
@@ -1,99 +1,99 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
# encoding: UTF-8
|
|
3
|
-
|
|
4
|
-
require File.expand_path('../test_helper', __FILE__)
|
|
5
|
-
require 'fileutils'
|
|
6
|
-
require 'stringio'
|
|
7
|
-
require 'tmpdir'
|
|
8
|
-
require_relative 'prime'
|
|
9
|
-
|
|
10
|
-
# -- Tests ----
|
|
11
|
-
class PrinterFlatTest < TestCase
|
|
12
|
-
def run_profile
|
|
13
|
-
RubyProf::Profile.profile(:
|
|
14
|
-
run_primes(1000, 5000)
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def flat_output_nth_column_values(output, n)
|
|
19
|
-
only_method_calls = output.split("\n").select { |line| line =~ /^\s+\d+/ }
|
|
20
|
-
only_method_calls.collect { |line| line.split(/\s+/)[n] }
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def helper_test_flat_string(klass)
|
|
24
|
-
output = StringIO.new
|
|
25
|
-
|
|
26
|
-
printer = klass.new(self.run_profile)
|
|
27
|
-
printer.print(output)
|
|
28
|
-
|
|
29
|
-
assert_match(/Thread ID: -?\d+/i, output.string)
|
|
30
|
-
assert_match(/Fiber ID: -?\d+/i, output.string)
|
|
31
|
-
assert_match(/Total: \d+\.\d+/i, output.string)
|
|
32
|
-
assert_match(/Object#run_primes/i, output.string)
|
|
33
|
-
output.string
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def assert_sorted(array)
|
|
37
|
-
array = array.map(&:to_f) # allow for > 10s times to sort right, since lexographically 4.0 > 10.0
|
|
38
|
-
assert_equal(array, array.sort.reverse)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def test_flat_string
|
|
42
|
-
output = helper_test_flat_string(RubyProf::FlatPrinter)
|
|
43
|
-
assert_match(/prime.rb/, output)
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def test_flat_result_sorting_by_self_time_is_default
|
|
47
|
-
printer = RubyProf::FlatPrinter.new(self.run_profile)
|
|
48
|
-
|
|
49
|
-
output = StringIO.new
|
|
50
|
-
printer.print(output)
|
|
51
|
-
self_times = flat_output_nth_column_values(output.string, 3)
|
|
52
|
-
|
|
53
|
-
assert_sorted self_times
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def test_flat_result_sorting
|
|
57
|
-
printer = RubyProf::FlatPrinter.new(self.run_profile)
|
|
58
|
-
|
|
59
|
-
sort_method_with_column_number = {:
|
|
60
|
-
|
|
61
|
-
sort_method_with_column_number.each_pair do |sort_method, n|
|
|
62
|
-
output = StringIO.new
|
|
63
|
-
printer.print(output, :
|
|
64
|
-
|
|
65
|
-
times = flat_output_nth_column_values(output.string, n)
|
|
66
|
-
assert_sorted(times)
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def test_flat_result_max_percent
|
|
71
|
-
printer = RubyProf::FlatPrinter.new(self.run_profile)
|
|
72
|
-
|
|
73
|
-
output = StringIO.new
|
|
74
|
-
printer.print(output, max_percent: 1)
|
|
75
|
-
self_percents = flat_output_nth_column_values(output.string, 1).map(&:to_f)
|
|
76
|
-
|
|
77
|
-
assert self_percents.max < 1
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def test_flat_result_filter_by_total_time
|
|
81
|
-
printer = RubyProf::FlatPrinter.new(self.run_profile)
|
|
82
|
-
|
|
83
|
-
output = StringIO.new
|
|
84
|
-
printer.print(output, filter_by: :total_time, min_percent: 50)
|
|
85
|
-
total_times = flat_output_nth_column_values(output.string, 2).map(&:to_f)
|
|
86
|
-
|
|
87
|
-
assert (total_times.min / total_times.max) >= 0.5
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def test_flat_result_filter_by_self_time
|
|
91
|
-
printer = RubyProf::FlatPrinter.new(self.run_profile)
|
|
92
|
-
|
|
93
|
-
output = StringIO.new
|
|
94
|
-
printer.print(output, filter_by: :self_time, min_percent: 0.1)
|
|
95
|
-
self_percents = flat_output_nth_column_values(output.string, 1).map(&:to_f)
|
|
96
|
-
|
|
97
|
-
assert self_percents.min >= 0.1
|
|
98
|
-
end
|
|
99
|
-
end
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# encoding: UTF-8
|
|
3
|
+
|
|
4
|
+
require File.expand_path('../test_helper', __FILE__)
|
|
5
|
+
require 'fileutils'
|
|
6
|
+
require 'stringio'
|
|
7
|
+
require 'tmpdir'
|
|
8
|
+
require_relative 'prime'
|
|
9
|
+
|
|
10
|
+
# -- Tests ----
|
|
11
|
+
class PrinterFlatTest < TestCase
|
|
12
|
+
def run_profile
|
|
13
|
+
RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
|
|
14
|
+
run_primes(1000, 5000)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def flat_output_nth_column_values(output, n)
|
|
19
|
+
only_method_calls = output.split("\n").select { |line| line =~ /^\s+\d+/ }
|
|
20
|
+
only_method_calls.collect { |line| line.split(/\s+/)[n] }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def helper_test_flat_string(klass)
|
|
24
|
+
output = StringIO.new
|
|
25
|
+
|
|
26
|
+
printer = klass.new(self.run_profile)
|
|
27
|
+
printer.print(output)
|
|
28
|
+
|
|
29
|
+
assert_match(/Thread ID: -?\d+/i, output.string)
|
|
30
|
+
assert_match(/Fiber ID: -?\d+/i, output.string)
|
|
31
|
+
assert_match(/Total: \d+\.\d+/i, output.string)
|
|
32
|
+
assert_match(/Object#run_primes/i, output.string)
|
|
33
|
+
output.string
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def assert_sorted(array)
|
|
37
|
+
array = array.map(&:to_f) # allow for > 10s times to sort right, since lexographically 4.0 > 10.0
|
|
38
|
+
assert_equal(array, array.sort.reverse)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_flat_string
|
|
42
|
+
output = helper_test_flat_string(RubyProf::FlatPrinter)
|
|
43
|
+
assert_match(/prime.rb/, output)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def test_flat_result_sorting_by_self_time_is_default
|
|
47
|
+
printer = RubyProf::FlatPrinter.new(self.run_profile)
|
|
48
|
+
|
|
49
|
+
output = StringIO.new
|
|
50
|
+
printer.print(output)
|
|
51
|
+
self_times = flat_output_nth_column_values(output.string, 3)
|
|
52
|
+
|
|
53
|
+
assert_sorted self_times
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def test_flat_result_sorting
|
|
57
|
+
printer = RubyProf::FlatPrinter.new(self.run_profile)
|
|
58
|
+
|
|
59
|
+
sort_method_with_column_number = {total_time: 2, self_time: 3, wait_time: 4, children_time: 5}
|
|
60
|
+
|
|
61
|
+
sort_method_with_column_number.each_pair do |sort_method, n|
|
|
62
|
+
output = StringIO.new
|
|
63
|
+
printer.print(output, sort_method: sort_method)
|
|
64
|
+
|
|
65
|
+
times = flat_output_nth_column_values(output.string, n)
|
|
66
|
+
assert_sorted(times)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def test_flat_result_max_percent
|
|
71
|
+
printer = RubyProf::FlatPrinter.new(self.run_profile)
|
|
72
|
+
|
|
73
|
+
output = StringIO.new
|
|
74
|
+
printer.print(output, max_percent: 1)
|
|
75
|
+
self_percents = flat_output_nth_column_values(output.string, 1).map(&:to_f)
|
|
76
|
+
|
|
77
|
+
assert self_percents.max < 1
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def test_flat_result_filter_by_total_time
|
|
81
|
+
printer = RubyProf::FlatPrinter.new(self.run_profile)
|
|
82
|
+
|
|
83
|
+
output = StringIO.new
|
|
84
|
+
printer.print(output, filter_by: :total_time, min_percent: 50)
|
|
85
|
+
total_times = flat_output_nth_column_values(output.string, 2).map(&:to_f)
|
|
86
|
+
|
|
87
|
+
assert (total_times.min / total_times.max) >= 0.5
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def test_flat_result_filter_by_self_time
|
|
91
|
+
printer = RubyProf::FlatPrinter.new(self.run_profile)
|
|
92
|
+
|
|
93
|
+
output = StringIO.new
|
|
94
|
+
printer.print(output, filter_by: :self_time, min_percent: 0.1)
|
|
95
|
+
self_percents = flat_output_nth_column_values(output.string, 1).map(&:to_f)
|
|
96
|
+
|
|
97
|
+
assert self_percents.min >= 0.1
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -1,59 +1,62 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
# encoding: UTF-8
|
|
3
|
-
|
|
4
|
-
require File.expand_path('../test_helper', __FILE__)
|
|
5
|
-
require 'fileutils'
|
|
6
|
-
require '
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
only_root_calls.
|
|
22
|
-
only_root_calls.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
printer.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
assert_match(
|
|
37
|
-
assert_match(
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
printer
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
sort_method_with_column_number
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# encoding: UTF-8
|
|
3
|
+
|
|
4
|
+
require File.expand_path('../test_helper', __FILE__)
|
|
5
|
+
require 'fileutils'
|
|
6
|
+
require 'stringio'
|
|
7
|
+
require 'tmpdir'
|
|
8
|
+
require_relative 'prime'
|
|
9
|
+
|
|
10
|
+
# -- Tests ----
|
|
11
|
+
class PrinterGraphHtmlTest < TestCase
|
|
12
|
+
def setup
|
|
13
|
+
super
|
|
14
|
+
# WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
|
|
15
|
+
@result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
|
|
16
|
+
run_primes(1000, 5000)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def graph_html_output_nth_column_values(output, n)
|
|
21
|
+
only_root_calls = output.split('<tr class="method">')
|
|
22
|
+
only_root_calls.delete_at(0)
|
|
23
|
+
only_root_calls.collect {|line| line.scan(/[\d\.]+/)[n - 1] }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def assert_sorted array
|
|
27
|
+
array = array.map{|n| n.to_f} # allow for > 10s times to sort right, since lexographically 4.0 > 10.0
|
|
28
|
+
assert_equal array, array.sort.reverse, "Array #{array.inspect} is not sorted"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def test_graph_html_string
|
|
32
|
+
output = StringIO.new
|
|
33
|
+
printer = RubyProf::GraphHtmlPrinter.new(@result)
|
|
34
|
+
printer.print(output)
|
|
35
|
+
|
|
36
|
+
assert_match(/<!DOCTYPE html>/i, output.string)
|
|
37
|
+
assert_match( %r{<th>Total</th>}i, output.string)
|
|
38
|
+
assert_match(/Object#run_primes/i, output.string)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_graph_html_result_sorting_by_total_time_is_default
|
|
42
|
+
printer = RubyProf::GraphHtmlPrinter.new(@result)
|
|
43
|
+
output = StringIO.new
|
|
44
|
+
printer.print(output)
|
|
45
|
+
total_times = graph_html_output_nth_column_values(output.string, 3)
|
|
46
|
+
|
|
47
|
+
assert_sorted total_times
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_graph_html_result_sorting
|
|
51
|
+
printer = RubyProf::GraphHtmlPrinter.new(@result)
|
|
52
|
+
|
|
53
|
+
sort_method_with_column_number = {total_time: 3, self_time: 4, wait_time: 5, children_time: 6}
|
|
54
|
+
|
|
55
|
+
sort_method_with_column_number.each_pair do |sort_method, n|
|
|
56
|
+
output = StringIO.new
|
|
57
|
+
printer.print(output, sort_method: sort_method)
|
|
58
|
+
times = graph_html_output_nth_column_values(output.string, n)
|
|
59
|
+
assert_sorted times
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
data/test/printer_graph_test.rb
CHANGED
|
@@ -1,40 +1,42 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
# encoding: UTF-8
|
|
3
|
-
|
|
4
|
-
require File.expand_path('../test_helper', __FILE__)
|
|
5
|
-
require 'fileutils'
|
|
6
|
-
require '
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
only_root_calls.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
end
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# encoding: UTF-8
|
|
3
|
+
|
|
4
|
+
require File.expand_path('../test_helper', __FILE__)
|
|
5
|
+
require 'fileutils'
|
|
6
|
+
require 'stringio'
|
|
7
|
+
require 'tmpdir'
|
|
8
|
+
require_relative 'prime'
|
|
9
|
+
|
|
10
|
+
# -- Tests ----
|
|
11
|
+
class PrinterGraphTest < TestCase
|
|
12
|
+
def setup
|
|
13
|
+
super
|
|
14
|
+
# WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
|
|
15
|
+
@result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
|
|
16
|
+
run_primes(1000, 5000)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def graph_output_nth_column_values(output, n)
|
|
21
|
+
only_root_calls = output.split("\n").select { |line| line =~ /^ +[\d\.]+%/ }
|
|
22
|
+
only_root_calls.collect { |line| line.split(/ +/)[n] }
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def assert_sorted(array)
|
|
26
|
+
array = array.map {|n| n.to_f} # allow for > 10s times to sort right, since lexographically 4.0 > 10.0
|
|
27
|
+
assert_equal(array, array.sort.reverse, "Array #{array.inspect} is not sorted")
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_graph_results_sorting
|
|
31
|
+
printer = RubyProf::GraphPrinter.new(@result)
|
|
32
|
+
|
|
33
|
+
sort_method_with_column_number = {total_time: 3, self_time: 4, wait_time: 5, children_time: 6}
|
|
34
|
+
|
|
35
|
+
sort_method_with_column_number.each_pair do |sort_method, n|
|
|
36
|
+
output = StringIO.new
|
|
37
|
+
printer.print(output, sort_method: sort_method)
|
|
38
|
+
times = graph_output_nth_column_values(output.string, n)
|
|
39
|
+
assert_sorted times
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
data/test/printers_test.rb
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
1
|
# encoding: UTF-8
|
|
3
2
|
|
|
4
3
|
require File.expand_path('../test_helper', __FILE__)
|
|
@@ -12,7 +11,7 @@ class PrintersTest < TestCase
|
|
|
12
11
|
def setup
|
|
13
12
|
super
|
|
14
13
|
# WALL_TIME, PROCESS_TIME, ALLOCATIONS and MEMORY as types of measuremen
|
|
15
|
-
measure_modes = {wall_time: RubyProf::WALL_TIME, process_time: RubyProf::PROCESS_TIME, allocations: RubyProf::ALLOCATIONS
|
|
14
|
+
measure_modes = {wall_time: RubyProf::WALL_TIME, process_time: RubyProf::PROCESS_TIME, allocations: RubyProf::ALLOCATIONS}
|
|
16
15
|
|
|
17
16
|
@results = {}
|
|
18
17
|
|
|
@@ -24,13 +23,13 @@ class PrintersTest < TestCase
|
|
|
24
23
|
end
|
|
25
24
|
|
|
26
25
|
def test_printers
|
|
27
|
-
output = ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT'] == "1" ? STDOUT : StringIO.new
|
|
26
|
+
output = ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT'] == "1" ? STDOUT : StringIO.new
|
|
28
27
|
|
|
29
28
|
printer = RubyProf::CallStackPrinter.new(@results[:wall_time])
|
|
30
29
|
printer.print(output)
|
|
31
30
|
|
|
32
31
|
printer = RubyProf::CallTreePrinter.new(@results[:wall_time])
|
|
33
|
-
printer.print(:
|
|
32
|
+
printer.print(path: Dir.tmpdir)
|
|
34
33
|
|
|
35
34
|
printer = RubyProf::FlatPrinter.new(@results[:wall_time])
|
|
36
35
|
printer.print(output)
|
|
@@ -47,10 +46,10 @@ class PrintersTest < TestCase
|
|
|
47
46
|
File.open("#{Dir.tmpdir}/graph.dot", "w") {|f| printer.print(f)}
|
|
48
47
|
|
|
49
48
|
printer = RubyProf::CallStackPrinter.new(@results[:wall_time])
|
|
50
|
-
File.open("#{Dir.tmpdir}/stack.html", "w") {|f| printer.print(f, :
|
|
49
|
+
File.open("#{Dir.tmpdir}/stack.html", "w") {|f| printer.print(f, application: "primes")}
|
|
51
50
|
|
|
52
51
|
printer = RubyProf::MultiPrinter.new(@results[:wall_time])
|
|
53
|
-
printer.print(:
|
|
52
|
+
printer.print(path: Dir.tmpdir, profile: "multi", application: "primes")
|
|
54
53
|
|
|
55
54
|
['graph.dot', 'multi.flat.txt', 'multi.graph.html', "multi.callgrind.out.#{$$}", 'multi.stack.html', 'stack.html'].each do |file_name|
|
|
56
55
|
file_path = File.join(Dir.tmpdir, file_name)
|
|
@@ -58,63 +57,50 @@ class PrintersTest < TestCase
|
|
|
58
57
|
end
|
|
59
58
|
end
|
|
60
59
|
|
|
61
|
-
def
|
|
60
|
+
def test_refuses_positional_arguments
|
|
62
61
|
p = RubyProf::MultiPrinter.new(@results[:wall_time])
|
|
63
|
-
|
|
62
|
+
assert_raises(ArgumentError) do
|
|
64
63
|
p.print(STDOUT)
|
|
65
|
-
flunk "should have raised an ArgumentError"
|
|
66
|
-
rescue ArgumentError => e
|
|
67
|
-
assert_match(/IO/, e.to_s)
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def test_refuses_non_hashes
|
|
72
|
-
p = RubyProf::MultiPrinter.new (@results[:wall_time])
|
|
73
|
-
begin
|
|
74
|
-
p.print([])
|
|
75
|
-
flunk "should have raised an ArgumentError"
|
|
76
|
-
rescue ArgumentError => e
|
|
77
|
-
assert_match(/hash/, e.to_s)
|
|
78
64
|
end
|
|
79
65
|
end
|
|
80
66
|
|
|
81
67
|
def test_flat_string
|
|
82
68
|
output = helper_test_flat_string(RubyProf::FlatPrinter)
|
|
83
|
-
assert_match(/prime.rb/, output)
|
|
69
|
+
assert_match(/prime.rb/, output.string)
|
|
84
70
|
end
|
|
85
71
|
|
|
86
72
|
def helper_test_flat_string(klass)
|
|
87
|
-
output =
|
|
73
|
+
output = StringIO.new
|
|
88
74
|
|
|
89
75
|
printer = klass.new(@results[:wall_time])
|
|
90
76
|
printer.print(output)
|
|
91
77
|
|
|
92
|
-
assert_match(/Thread ID: -?\d+/i, output)
|
|
93
|
-
assert_match(/Fiber ID: -?\d+/i, output)
|
|
94
|
-
assert_match(/Total: \d+\.\d+/i, output)
|
|
95
|
-
assert_match(/Object#run_primes/i, output)
|
|
78
|
+
assert_match(/Thread ID: -?\d+/i, output.string)
|
|
79
|
+
assert_match(/Fiber ID: -?\d+/i, output.string)
|
|
80
|
+
assert_match(/Total: \d+\.\d+/i, output.string)
|
|
81
|
+
assert_match(/Object#run_primes/i, output.string)
|
|
96
82
|
output
|
|
97
83
|
end
|
|
98
84
|
|
|
99
85
|
def test_graph_html_string
|
|
100
|
-
output =
|
|
86
|
+
output = StringIO.new
|
|
101
87
|
printer = RubyProf::GraphHtmlPrinter.new(@results[:wall_time])
|
|
102
88
|
printer.print(output)
|
|
103
89
|
|
|
104
|
-
assert_match(/<!DOCTYPE html>/i, output)
|
|
105
|
-
assert_match( %r{<th>Total</th>}i, output)
|
|
106
|
-
assert_match(/Object#run_primes/i, output)
|
|
90
|
+
assert_match(/<!DOCTYPE html>/i, output.string)
|
|
91
|
+
assert_match( %r{<th>Total</th>}i, output.string)
|
|
92
|
+
assert_match(/Object#run_primes/i, output.string)
|
|
107
93
|
end
|
|
108
94
|
|
|
109
95
|
def test_graph_string
|
|
110
|
-
output =
|
|
96
|
+
output = StringIO.new
|
|
111
97
|
printer = RubyProf::GraphPrinter.new(@results[:wall_time])
|
|
112
98
|
printer.print(output)
|
|
113
99
|
|
|
114
|
-
assert_match(/Thread ID: -?\d+/i, output)
|
|
115
|
-
assert_match(/Fiber ID: -?\d+/i, output)
|
|
116
|
-
assert_match(/Total Time: \d+\.\d+/i, output)
|
|
117
|
-
assert_match(/Object#run_primes/i, output)
|
|
100
|
+
assert_match(/Thread ID: -?\d+/i, output.string)
|
|
101
|
+
assert_match(/Fiber ID: -?\d+/i, output.string)
|
|
102
|
+
assert_match(/Total Time: \d+\.\d+/i, output.string)
|
|
103
|
+
assert_match(/Object#run_primes/i, output.string)
|
|
118
104
|
end
|
|
119
105
|
|
|
120
106
|
def do_nothing
|
|
@@ -133,14 +119,14 @@ class PrintersTest < TestCase
|
|
|
133
119
|
# RubyProf::FlatPrinter only outputs if self time > percent...
|
|
134
120
|
for klass in [RubyProf::GraphPrinter, RubyProf::GraphHtmlPrinter]
|
|
135
121
|
printer = klass.new(result)
|
|
136
|
-
out =
|
|
137
|
-
printer.print(out, :
|
|
138
|
-
assert_match(/do_nothing/, out)
|
|
122
|
+
out = StringIO.new
|
|
123
|
+
printer.print(out, min_percent: 0.00000001)
|
|
124
|
+
assert_match(/do_nothing/, out.string)
|
|
139
125
|
end
|
|
140
126
|
end
|
|
141
127
|
|
|
142
128
|
def test_print_footer
|
|
143
|
-
results_keys = [:wall_time, :process_time, :allocations
|
|
129
|
+
results_keys = [:wall_time, :process_time, :allocations]
|
|
144
130
|
expected_matches = [
|
|
145
131
|
"The percentage of time spent by this method relative to the total time in the entire program.",
|
|
146
132
|
"The total time spent by this method and its children.",
|
|
@@ -157,7 +143,7 @@ class PrintersTest < TestCase
|
|
|
157
143
|
]
|
|
158
144
|
|
|
159
145
|
results_keys.each do |key|
|
|
160
|
-
output =
|
|
146
|
+
output = StringIO.new
|
|
161
147
|
printer = RubyProf::GraphPrinter.new(@results[key])
|
|
162
148
|
printer.print(output)
|
|
163
149
|
|
|
@@ -166,12 +152,10 @@ class PrintersTest < TestCase
|
|
|
166
152
|
matches = expected_matches[0..3]
|
|
167
153
|
when :allocations
|
|
168
154
|
matches = expected_matches[4..7]
|
|
169
|
-
when :memory
|
|
170
|
-
matches = expected_matches[8..11]
|
|
171
155
|
end
|
|
172
156
|
|
|
173
157
|
matches.each do |pattern|
|
|
174
|
-
assert_match(pattern, output)
|
|
158
|
+
assert_match(pattern, output.string)
|
|
175
159
|
end
|
|
176
160
|
end
|
|
177
161
|
end
|