ruby-prof 2.0.0 → 2.0.1
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/CHANGELOG.md +3 -0
- data/bin/ruby-prof-check-trace +45 -45
- data/docs/advanced-usage.md +132 -132
- data/docs/best-practices.md +27 -27
- data/docs/getting-started.md +130 -130
- data/docs/index.md +45 -45
- data/docs/profiling-rails.md +64 -64
- data/docs/public/examples/generate_reports.rb +92 -92
- data/docs/public/examples/reports/call_stack.html +835 -835
- data/docs/public/examples/reports/graph.html +1319 -1319
- data/docs/reports.md +150 -150
- data/lib/ruby-prof/version.rb +1 -1
- data/ruby-prof.gemspec +66 -66
- data/test/call_tree_builder.rb +126 -126
- data/test/exceptions_test.rb +24 -24
- data/test/marshal_test.rb +144 -144
- data/test/printer_call_stack_test.rb +28 -28
- data/test/printer_flame_graph_test.rb +82 -82
- data/test/printer_flat_test.rb +99 -99
- data/test/printer_graph_html_test.rb +62 -62
- data/test/printer_graph_test.rb +42 -42
- data/test/printers_test.rb +162 -162
- data/test/printing_recursive_graph_test.rb +81 -81
- data/test/profile_test.rb +101 -101
- data/test/rack_test.rb +103 -103
- data/test/scheduler.rb +367 -367
- data/test/singleton_test.rb +39 -39
- data/test/thread_test.rb +229 -229
- data/test/yarv_test.rb +56 -56
- metadata +3 -3
|
@@ -1,82 +1,82 @@
|
|
|
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 PrinterFlameGraphTest < 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 test_flame_graph_string
|
|
21
|
-
output = StringIO.new
|
|
22
|
-
printer = RubyProf::FlameGraphPrinter.new(@result)
|
|
23
|
-
printer.print(output)
|
|
24
|
-
|
|
25
|
-
assert_match(/<!DOCTYPE html>/i, output.string)
|
|
26
|
-
assert_match(/flame-svg/, output.string)
|
|
27
|
-
assert_match(/Object#run_primes/i, output.string)
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def test_flame_graph_stringio
|
|
31
|
-
output = StringIO.new
|
|
32
|
-
printer = RubyProf::FlameGraphPrinter.new(@result)
|
|
33
|
-
printer.print(output)
|
|
34
|
-
|
|
35
|
-
result = output.string
|
|
36
|
-
assert_match(/<!DOCTYPE html>/i, result)
|
|
37
|
-
assert_match(/flame-svg/, result)
|
|
38
|
-
assert_match(/Object#run_primes/i, result)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def test_flame_graph_contains_svg_elements
|
|
42
|
-
output = StringIO.new
|
|
43
|
-
printer = RubyProf::FlameGraphPrinter.new(@result)
|
|
44
|
-
printer.print(output)
|
|
45
|
-
|
|
46
|
-
assert_match(/<svg/, output.string)
|
|
47
|
-
assert_match(/renderNode/, output.string)
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def test_flame_graph_contains_json_data
|
|
51
|
-
output = StringIO.new
|
|
52
|
-
printer = RubyProf::FlameGraphPrinter.new(@result)
|
|
53
|
-
printer.print(output)
|
|
54
|
-
|
|
55
|
-
# The template embeds thread data as JSON
|
|
56
|
-
assert_match(/"name"/, output.string)
|
|
57
|
-
assert_match(/"value"/, output.string)
|
|
58
|
-
assert_match(/"children"/, output.string)
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def test_flame_graph_custom_title
|
|
62
|
-
output = StringIO.new
|
|
63
|
-
printer = RubyProf::FlameGraphPrinter.new(@result)
|
|
64
|
-
printer.print(output, title: "Custom Flame Graph")
|
|
65
|
-
|
|
66
|
-
assert_match(/Custom Flame Graph/, output.string)
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def test_flame_graph_file_output
|
|
70
|
-
Dir.mktmpdir do |dir|
|
|
71
|
-
path = File.join(dir, "flame_graph.html")
|
|
72
|
-
File.open(path, "wb") do |file|
|
|
73
|
-
printer = RubyProf::FlameGraphPrinter.new(@result)
|
|
74
|
-
printer.print(file)
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
content = File.read(path)
|
|
78
|
-
assert_match(/<!DOCTYPE html>/i, content)
|
|
79
|
-
assert_match(/Object#run_primes/i, content)
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
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 PrinterFlameGraphTest < 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 test_flame_graph_string
|
|
21
|
+
output = StringIO.new
|
|
22
|
+
printer = RubyProf::FlameGraphPrinter.new(@result)
|
|
23
|
+
printer.print(output)
|
|
24
|
+
|
|
25
|
+
assert_match(/<!DOCTYPE html>/i, output.string)
|
|
26
|
+
assert_match(/flame-svg/, output.string)
|
|
27
|
+
assert_match(/Object#run_primes/i, output.string)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_flame_graph_stringio
|
|
31
|
+
output = StringIO.new
|
|
32
|
+
printer = RubyProf::FlameGraphPrinter.new(@result)
|
|
33
|
+
printer.print(output)
|
|
34
|
+
|
|
35
|
+
result = output.string
|
|
36
|
+
assert_match(/<!DOCTYPE html>/i, result)
|
|
37
|
+
assert_match(/flame-svg/, result)
|
|
38
|
+
assert_match(/Object#run_primes/i, result)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_flame_graph_contains_svg_elements
|
|
42
|
+
output = StringIO.new
|
|
43
|
+
printer = RubyProf::FlameGraphPrinter.new(@result)
|
|
44
|
+
printer.print(output)
|
|
45
|
+
|
|
46
|
+
assert_match(/<svg/, output.string)
|
|
47
|
+
assert_match(/renderNode/, output.string)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_flame_graph_contains_json_data
|
|
51
|
+
output = StringIO.new
|
|
52
|
+
printer = RubyProf::FlameGraphPrinter.new(@result)
|
|
53
|
+
printer.print(output)
|
|
54
|
+
|
|
55
|
+
# The template embeds thread data as JSON
|
|
56
|
+
assert_match(/"name"/, output.string)
|
|
57
|
+
assert_match(/"value"/, output.string)
|
|
58
|
+
assert_match(/"children"/, output.string)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_flame_graph_custom_title
|
|
62
|
+
output = StringIO.new
|
|
63
|
+
printer = RubyProf::FlameGraphPrinter.new(@result)
|
|
64
|
+
printer.print(output, title: "Custom Flame Graph")
|
|
65
|
+
|
|
66
|
+
assert_match(/Custom Flame Graph/, output.string)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def test_flame_graph_file_output
|
|
70
|
+
Dir.mktmpdir do |dir|
|
|
71
|
+
path = File.join(dir, "flame_graph.html")
|
|
72
|
+
File.open(path, "wb") do |file|
|
|
73
|
+
printer = RubyProf::FlameGraphPrinter.new(@result)
|
|
74
|
+
printer.print(file)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
content = File.read(path)
|
|
78
|
+
assert_match(/<!DOCTYPE html>/i, content)
|
|
79
|
+
assert_match(/Object#run_primes/i, content)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
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(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
|
+
#!/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,62 +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 '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
|
|
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,42 +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 '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
|
|
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
|