ruby-prof 0.17.0 → 0.18.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 +5 -5
- data/CHANGES +500 -482
- data/LICENSE +24 -24
- data/README.rdoc +487 -485
- data/Rakefile +113 -113
- data/bin/ruby-prof +345 -345
- data/bin/ruby-prof-check-trace +45 -45
- data/examples/flat.txt +50 -50
- data/examples/graph.dot +84 -84
- data/examples/graph.html +823 -823
- data/examples/graph.txt +139 -139
- data/examples/multi.flat.txt +23 -23
- data/examples/multi.graph.html +760 -760
- data/examples/multi.grind.dat +114 -114
- data/examples/multi.stack.html +547 -547
- data/examples/stack.html +547 -547
- data/ext/ruby_prof/extconf.rb +68 -68
- data/ext/ruby_prof/rp_call_info.c +425 -425
- data/ext/ruby_prof/rp_call_info.h +53 -53
- data/ext/ruby_prof/rp_measure.c +40 -40
- data/ext/ruby_prof/rp_measure.h +45 -45
- data/ext/ruby_prof/rp_measure_allocations.c +76 -76
- data/ext/ruby_prof/rp_measure_cpu_time.c +136 -136
- data/ext/ruby_prof/rp_measure_gc_runs.c +73 -73
- data/ext/ruby_prof/rp_measure_gc_time.c +60 -60
- data/ext/ruby_prof/rp_measure_memory.c +77 -77
- data/ext/ruby_prof/rp_measure_process_time.c +71 -71
- data/ext/ruby_prof/rp_measure_wall_time.c +45 -45
- data/ext/ruby_prof/rp_method.c +630 -636
- data/ext/ruby_prof/rp_method.h +75 -75
- data/ext/ruby_prof/rp_stack.c +173 -173
- data/ext/ruby_prof/rp_stack.h +63 -63
- data/ext/ruby_prof/rp_thread.c +277 -276
- data/ext/ruby_prof/rp_thread.h +27 -27
- data/ext/ruby_prof/ruby_prof.c +794 -774
- data/ext/ruby_prof/ruby_prof.h +60 -59
- data/ext/ruby_prof/vc/ruby_prof.sln +20 -21
- data/ext/ruby_prof/vc/{ruby_prof_20.vcxproj → ruby_prof.vcxproj} +31 -0
- data/lib/ruby-prof.rb +68 -68
- data/lib/ruby-prof/aggregate_call_info.rb +76 -76
- data/lib/ruby-prof/assets/call_stack_printer.css.html +116 -116
- data/lib/ruby-prof/assets/call_stack_printer.js.html +384 -384
- data/lib/ruby-prof/call_info.rb +115 -115
- data/lib/ruby-prof/call_info_visitor.rb +40 -40
- data/lib/ruby-prof/compatibility.rb +179 -178
- data/lib/ruby-prof/method_info.rb +121 -121
- data/lib/ruby-prof/printers/abstract_printer.rb +104 -103
- data/lib/ruby-prof/printers/call_info_printer.rb +41 -41
- data/lib/ruby-prof/printers/call_stack_printer.rb +265 -265
- data/lib/ruby-prof/printers/call_tree_printer.rb +143 -143
- data/lib/ruby-prof/printers/dot_printer.rb +132 -132
- data/lib/ruby-prof/printers/flat_printer.rb +70 -70
- data/lib/ruby-prof/printers/flat_printer_with_line_numbers.rb +83 -83
- data/lib/ruby-prof/printers/graph_html_printer.rb +249 -249
- data/lib/ruby-prof/printers/graph_printer.rb +116 -116
- data/lib/ruby-prof/printers/multi_printer.rb +84 -84
- data/lib/ruby-prof/profile.rb +26 -26
- data/lib/ruby-prof/profile/exclude_common_methods.rb +207 -201
- data/lib/ruby-prof/profile/legacy_method_elimination.rb +50 -49
- data/lib/ruby-prof/rack.rb +174 -174
- data/lib/ruby-prof/task.rb +147 -147
- data/lib/ruby-prof/thread.rb +35 -35
- data/lib/ruby-prof/version.rb +3 -3
- data/lib/unprof.rb +10 -10
- data/ruby-prof.gemspec +58 -58
- data/test/abstract_printer_test.rb +53 -0
- data/test/aggregate_test.rb +136 -136
- data/test/basic_test.rb +128 -128
- data/test/block_test.rb +74 -74
- data/test/call_info_test.rb +78 -78
- data/test/call_info_visitor_test.rb +31 -31
- data/test/duplicate_names_test.rb +32 -32
- data/test/dynamic_method_test.rb +55 -55
- data/test/enumerable_test.rb +21 -21
- data/test/exceptions_test.rb +24 -16
- data/test/exclude_methods_test.rb +146 -146
- data/test/exclude_threads_test.rb +53 -53
- data/test/fiber_test.rb +79 -79
- data/test/issue137_test.rb +63 -63
- data/test/line_number_test.rb +80 -80
- data/test/measure_allocations_test.rb +26 -26
- data/test/measure_cpu_time_test.rb +212 -213
- data/test/measure_gc_runs_test.rb +32 -32
- data/test/measure_gc_time_test.rb +36 -36
- data/test/measure_memory_test.rb +33 -33
- data/test/measure_process_time_test.rb +61 -63
- data/test/measure_wall_time_test.rb +255 -255
- data/test/method_elimination_test.rb +84 -84
- data/test/module_test.rb +45 -45
- data/test/multi_printer_test.rb +104 -104
- data/test/no_method_class_test.rb +15 -15
- data/test/pause_resume_test.rb +166 -166
- data/test/prime.rb +54 -54
- data/test/printers_test.rb +275 -275
- data/test/printing_recursive_graph_test.rb +127 -127
- data/test/rack_test.rb +157 -157
- data/test/recursive_test.rb +215 -215
- data/test/singleton_test.rb +38 -38
- data/test/stack_printer_test.rb +77 -78
- data/test/stack_test.rb +138 -138
- data/test/start_stop_test.rb +112 -112
- data/test/test_helper.rb +267 -275
- data/test/thread_test.rb +187 -187
- data/test/unique_call_path_test.rb +202 -202
- data/test/yarv_test.rb +55 -55
- metadata +17 -96
- data/doc/LICENSE.html +0 -115
- data/doc/README_rdoc.html +0 -637
- data/doc/Rack.html +0 -96
- data/doc/Rack/RubyProf.html +0 -233
- data/doc/Rack/RubyProf/RackProfiler.html +0 -343
- data/doc/RubyProf.html +0 -974
- data/doc/RubyProf/AbstractPrinter.html +0 -625
- data/doc/RubyProf/AggregateCallInfo.html +0 -552
- data/doc/RubyProf/CallInfo.html +0 -579
- data/doc/RubyProf/CallInfoPrinter.html +0 -121
- data/doc/RubyProf/CallInfoVisitor.html +0 -199
- data/doc/RubyProf/CallStackPrinter.html +0 -1127
- data/doc/RubyProf/CallTreePrinter.html +0 -725
- data/doc/RubyProf/Cmd.html +0 -637
- data/doc/RubyProf/DeprecationWarnings.html +0 -148
- data/doc/RubyProf/DotPrinter.html +0 -258
- data/doc/RubyProf/FlatPrinter.html +0 -164
- data/doc/RubyProf/FlatPrinterWithLineNumbers.html +0 -210
- data/doc/RubyProf/GraphHtmlPrinter.html +0 -558
- data/doc/RubyProf/GraphPrinter.html +0 -140
- data/doc/RubyProf/MethodInfo.html +0 -676
- data/doc/RubyProf/MultiPrinter.html +0 -574
- data/doc/RubyProf/Profile.html +0 -908
- data/doc/RubyProf/Profile/ExcludeCommonMethods.html +0 -411
- data/doc/RubyProf/Profile/LegacyMethodElimination.html +0 -158
- data/doc/RubyProf/ProfileTask.html +0 -491
- data/doc/RubyProf/Thread.html +0 -275
- data/doc/created.rid +0 -33
- data/doc/css/fonts.css +0 -167
- data/doc/css/rdoc.css +0 -590
- data/doc/examples/flat_txt.html +0 -139
- data/doc/examples/graph_html.html +0 -910
- data/doc/examples/graph_txt.html +0 -248
- data/doc/fonts/Lato-Light.ttf +0 -0
- data/doc/fonts/Lato-LightItalic.ttf +0 -0
- data/doc/fonts/Lato-Regular.ttf +0 -0
- data/doc/fonts/Lato-RegularItalic.ttf +0 -0
- data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
- data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
- data/doc/images/add.png +0 -0
- data/doc/images/arrow_up.png +0 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/transparent.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +0 -666
- data/doc/js/darkfish.js +0 -161
- data/doc/js/jquery.js +0 -4
- data/doc/js/navigation.js +0 -142
- data/doc/js/navigation.js.gz +0 -0
- data/doc/js/search.js +0 -109
- data/doc/js/search_index.js +0 -1
- data/doc/js/search_index.js.gz +0 -0
- data/doc/js/searcher.js +0 -229
- data/doc/js/searcher.js.gz +0 -0
- data/doc/table_of_contents.html +0 -1052
- data/examples/cachegrind.out.1 +0 -114
- data/examples/cachegrind.out.1.32313213 +0 -114
- data/ext/ruby_prof/vc/ruby_prof_18.vcxproj +0 -108
- data/ext/ruby_prof/vc/ruby_prof_19.vcxproj +0 -110
@@ -1,84 +1,84 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# encoding: UTF-8
|
3
|
-
|
4
|
-
require File.expand_path('../test_helper', __FILE__)
|
5
|
-
|
6
|
-
# Test data
|
7
|
-
# A
|
8
|
-
# / \
|
9
|
-
# B C
|
10
|
-
# \
|
11
|
-
# B
|
12
|
-
|
13
|
-
module MethodElimination
|
14
|
-
def self.a
|
15
|
-
1.times {|i| c}
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.b
|
19
|
-
sleep 0.1
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.c
|
23
|
-
1.times {|i| b}
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
class MethodEliminationTest < TestCase
|
28
|
-
def setup
|
29
|
-
# Need to use wall time for this test due to the sleep calls
|
30
|
-
RubyProf::measure_mode = RubyProf::WALL_TIME
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_setting_parent
|
34
|
-
result = RubyProf.profile do
|
35
|
-
1000.times { 1+1 }
|
36
|
-
end
|
37
|
-
method_infos = result.threads.first.methods.sort.reverse
|
38
|
-
assert(m1 = method_infos[0])
|
39
|
-
assert(c1 = m1.call_infos.first)
|
40
|
-
assert_nil(c1.parent)
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_methods_can_be_eliminated
|
44
|
-
RubyProf.start
|
45
|
-
5.times {MethodElimination.a}
|
46
|
-
result = RubyProf.stop
|
47
|
-
|
48
|
-
methods = result.threads.first.methods.sort.reverse
|
49
|
-
|
50
|
-
assert_equal(6, methods.count)
|
51
|
-
assert_equal('MethodEliminationTest#test_methods_can_be_eliminated', methods[0].full_name)
|
52
|
-
assert_equal('Integer#times', methods[1].full_name)
|
53
|
-
assert_equal('<Module::MethodElimination>#a', methods[2].full_name)
|
54
|
-
assert_equal('<Module::MethodElimination>#c', methods[3].full_name)
|
55
|
-
assert_equal('<Module::MethodElimination>#b', methods[4].full_name)
|
56
|
-
assert_equal('Kernel#sleep', methods[5].full_name)
|
57
|
-
|
58
|
-
result.eliminate_methods!([/Integer#times/])
|
59
|
-
|
60
|
-
methods = result.threads.first.methods.sort.reverse
|
61
|
-
assert_equal(5, methods.count)
|
62
|
-
assert_equal('MethodEliminationTest#test_methods_can_be_eliminated', methods[0].full_name)
|
63
|
-
assert_equal('<Module::MethodElimination>#a', methods[1].full_name)
|
64
|
-
assert_equal('<Module::MethodElimination>#c', methods[2].full_name)
|
65
|
-
assert_equal('<Module::MethodElimination>#b', methods[3].full_name)
|
66
|
-
assert_equal('Kernel#sleep', methods[4].full_name)
|
67
|
-
end
|
68
|
-
|
69
|
-
private
|
70
|
-
|
71
|
-
def assert_method_has_been_eliminated(result, eliminated_method)
|
72
|
-
result.threads.each do |thread|
|
73
|
-
thread.methods.each do |method|
|
74
|
-
method.call_infos.each do |ci|
|
75
|
-
assert(ci.target != eliminated_method, "broken self")
|
76
|
-
assert(ci.parent.target != eliminated_method, "broken parent") if ci.parent
|
77
|
-
ci.children.each do |callee|
|
78
|
-
assert(callee.target != eliminated_method, "broken kid")
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require File.expand_path('../test_helper', __FILE__)
|
5
|
+
|
6
|
+
# Test data
|
7
|
+
# A
|
8
|
+
# / \
|
9
|
+
# B C
|
10
|
+
# \
|
11
|
+
# B
|
12
|
+
|
13
|
+
module MethodElimination
|
14
|
+
def self.a
|
15
|
+
1.times {|i| c}
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.b
|
19
|
+
sleep 0.1
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.c
|
23
|
+
1.times {|i| b}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class MethodEliminationTest < TestCase
|
28
|
+
def setup
|
29
|
+
# Need to use wall time for this test due to the sleep calls
|
30
|
+
RubyProf::measure_mode = RubyProf::WALL_TIME
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_setting_parent
|
34
|
+
result = RubyProf.profile do
|
35
|
+
1000.times { 1+1 }
|
36
|
+
end
|
37
|
+
method_infos = result.threads.first.methods.sort.reverse
|
38
|
+
assert(m1 = method_infos[0])
|
39
|
+
assert(c1 = m1.call_infos.first)
|
40
|
+
assert_nil(c1.parent)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_methods_can_be_eliminated
|
44
|
+
RubyProf.start
|
45
|
+
5.times {MethodElimination.a}
|
46
|
+
result = RubyProf.stop
|
47
|
+
|
48
|
+
methods = result.threads.first.methods.sort.reverse
|
49
|
+
|
50
|
+
assert_equal(6, methods.count)
|
51
|
+
assert_equal('MethodEliminationTest#test_methods_can_be_eliminated', methods[0].full_name)
|
52
|
+
assert_equal('Integer#times', methods[1].full_name)
|
53
|
+
assert_equal('<Module::MethodElimination>#a', methods[2].full_name)
|
54
|
+
assert_equal('<Module::MethodElimination>#c', methods[3].full_name)
|
55
|
+
assert_equal('<Module::MethodElimination>#b', methods[4].full_name)
|
56
|
+
assert_equal('Kernel#sleep', methods[5].full_name)
|
57
|
+
|
58
|
+
result.eliminate_methods!([/Integer#times/])
|
59
|
+
|
60
|
+
methods = result.threads.first.methods.sort.reverse
|
61
|
+
assert_equal(5, methods.count)
|
62
|
+
assert_equal('MethodEliminationTest#test_methods_can_be_eliminated', methods[0].full_name)
|
63
|
+
assert_equal('<Module::MethodElimination>#a', methods[1].full_name)
|
64
|
+
assert_equal('<Module::MethodElimination>#c', methods[2].full_name)
|
65
|
+
assert_equal('<Module::MethodElimination>#b', methods[3].full_name)
|
66
|
+
assert_equal('Kernel#sleep', methods[4].full_name)
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def assert_method_has_been_eliminated(result, eliminated_method)
|
72
|
+
result.threads.each do |thread|
|
73
|
+
thread.methods.each do |method|
|
74
|
+
method.call_infos.each do |ci|
|
75
|
+
assert(ci.target != eliminated_method, "broken self")
|
76
|
+
assert(ci.parent.target != eliminated_method, "broken parent") if ci.parent
|
77
|
+
ci.children.each do |callee|
|
78
|
+
assert(callee.target != eliminated_method, "broken kid")
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
data/test/module_test.rb
CHANGED
@@ -1,45 +1,45 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# encoding: UTF-8
|
3
|
-
|
4
|
-
require File.expand_path('../test_helper', __FILE__)
|
5
|
-
|
6
|
-
# Need to use wall time for this test due to the sleep calls
|
7
|
-
RubyProf::measure_mode = RubyProf::WALL_TIME
|
8
|
-
|
9
|
-
module Foo
|
10
|
-
def Foo::hello
|
11
|
-
sleep(0.5)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
module Bar
|
16
|
-
def Bar::hello
|
17
|
-
sleep(0.5)
|
18
|
-
Foo::hello
|
19
|
-
end
|
20
|
-
|
21
|
-
def hello
|
22
|
-
sleep(0.5)
|
23
|
-
Bar::hello
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
include Bar
|
28
|
-
|
29
|
-
class ModuleTest < TestCase
|
30
|
-
def test_nested_modules
|
31
|
-
result = RubyProf.profile do
|
32
|
-
hello
|
33
|
-
end
|
34
|
-
|
35
|
-
methods = result.threads.first.methods
|
36
|
-
|
37
|
-
# Length should be 5
|
38
|
-
assert_equal(5, methods.length)
|
39
|
-
|
40
|
-
# these methods should be in there... (hard to tell order though).
|
41
|
-
for name in ['ModuleTest#test_nested_modules','Bar#hello','Kernel#sleep','<Module::Bar>#hello','<Module::Foo>#hello']
|
42
|
-
assert methods.map(&:full_name).include?( name )
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require File.expand_path('../test_helper', __FILE__)
|
5
|
+
|
6
|
+
# Need to use wall time for this test due to the sleep calls
|
7
|
+
RubyProf::measure_mode = RubyProf::WALL_TIME
|
8
|
+
|
9
|
+
module Foo
|
10
|
+
def Foo::hello
|
11
|
+
sleep(0.5)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module Bar
|
16
|
+
def Bar::hello
|
17
|
+
sleep(0.5)
|
18
|
+
Foo::hello
|
19
|
+
end
|
20
|
+
|
21
|
+
def hello
|
22
|
+
sleep(0.5)
|
23
|
+
Bar::hello
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
include Bar
|
28
|
+
|
29
|
+
class ModuleTest < TestCase
|
30
|
+
def test_nested_modules
|
31
|
+
result = RubyProf.profile do
|
32
|
+
hello
|
33
|
+
end
|
34
|
+
|
35
|
+
methods = result.threads.first.methods
|
36
|
+
|
37
|
+
# Length should be 5
|
38
|
+
assert_equal(5, methods.length)
|
39
|
+
|
40
|
+
# these methods should be in there... (hard to tell order though).
|
41
|
+
for name in ['ModuleTest#test_nested_modules','Bar#hello','Kernel#sleep','<Module::Bar>#hello','<Module::Foo>#hello']
|
42
|
+
assert methods.map(&:full_name).include?( name )
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/test/multi_printer_test.rb
CHANGED
@@ -1,104 +1,104 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# encoding: UTF-8
|
3
|
-
|
4
|
-
require File.expand_path('../test_helper', __FILE__)
|
5
|
-
|
6
|
-
# Test data
|
7
|
-
# A
|
8
|
-
# / \
|
9
|
-
# B C
|
10
|
-
# \
|
11
|
-
# B
|
12
|
-
|
13
|
-
class MSTPT
|
14
|
-
def a
|
15
|
-
100.times{b}
|
16
|
-
300.times{c}
|
17
|
-
c;c;c
|
18
|
-
end
|
19
|
-
|
20
|
-
def b
|
21
|
-
sleep 0
|
22
|
-
end
|
23
|
-
|
24
|
-
def c
|
25
|
-
5.times{b}
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
class MultiPrinterTest < TestCase
|
30
|
-
def setup
|
31
|
-
# Need to use wall time for this test due to the sleep calls
|
32
|
-
RubyProf::measure_mode = RubyProf::WALL_TIME
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_refuses_io_objects
|
36
|
-
# we don't need a real profile for this test
|
37
|
-
p = RubyProf::MultiPrinter.new nil
|
38
|
-
begin
|
39
|
-
p.print(STDOUT)
|
40
|
-
flunk "should have raised an ArgumentError"
|
41
|
-
rescue ArgumentError => e
|
42
|
-
assert_match(/IO/, e.to_s)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_refuses_non_hashes
|
47
|
-
# we don't need a real profile for this test
|
48
|
-
p = RubyProf::MultiPrinter.new nil
|
49
|
-
begin
|
50
|
-
p.print([])
|
51
|
-
flunk "should have raised an ArgumentError"
|
52
|
-
rescue ArgumentError => e
|
53
|
-
assert_match(/hash/, e.to_s)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def test_all_profiles_can_be_created
|
58
|
-
start_time = Time.now
|
59
|
-
RubyProf.start
|
60
|
-
5.times{MSTPT.new.a}
|
61
|
-
result = RubyProf.stop
|
62
|
-
end_time = Time.now
|
63
|
-
expected_time = end_time - start_time
|
64
|
-
graph = print(result)[1]
|
65
|
-
re = Regexp.new('
|
66
|
-
\s*<table>
|
67
|
-
\s*<tr>
|
68
|
-
\s*<th>Thread ID</th>
|
69
|
-
\s*(<th>Fiber ID</th>)?
|
70
|
-
\s*<th>Total Time</th>
|
71
|
-
\s*</tr>
|
72
|
-
\s*
|
73
|
-
\s*<tr>
|
74
|
-
\s*(<td>([\.0-9]+)</td>)?
|
75
|
-
\s*<td><a href="#-?\d+">-?\d+</a></td>
|
76
|
-
\s*<td>([\.0-9e]+)</td>
|
77
|
-
\s*</tr>
|
78
|
-
\s*
|
79
|
-
\s*</table>')
|
80
|
-
assert_match(re, graph)
|
81
|
-
graph =~ re
|
82
|
-
display_time = $4.to_f
|
83
|
-
assert_in_delta expected_time, display_time, 0.001
|
84
|
-
end
|
85
|
-
|
86
|
-
private
|
87
|
-
|
88
|
-
def print(result)
|
89
|
-
test = caller.first =~ /in `(.*)'/ ? $1 : "test"
|
90
|
-
path = RubyProf.tmpdir
|
91
|
-
profile = "ruby_prof_#{test}"
|
92
|
-
printer = RubyProf::MultiPrinter.new(result)
|
93
|
-
printer.print(:path => path, :profile => profile,
|
94
|
-
:threshold => 0, :min_percent => 0, :title => "ruby_prof #{test}")
|
95
|
-
if RUBY_PLATFORM =~ /darwin/ && ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT']=="1"
|
96
|
-
system("open '#{printer.stack_profile}'")
|
97
|
-
end
|
98
|
-
# if GC.respond_to?(:dump_file_and_line_info)
|
99
|
-
# GC.start
|
100
|
-
# GC.dump_file_and_line_info("heap.dump")
|
101
|
-
# end
|
102
|
-
[File.read(printer.stack_profile), File.read(printer.graph_profile)]
|
103
|
-
end
|
104
|
-
end
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require File.expand_path('../test_helper', __FILE__)
|
5
|
+
|
6
|
+
# Test data
|
7
|
+
# A
|
8
|
+
# / \
|
9
|
+
# B C
|
10
|
+
# \
|
11
|
+
# B
|
12
|
+
|
13
|
+
class MSTPT
|
14
|
+
def a
|
15
|
+
100.times{b}
|
16
|
+
300.times{c}
|
17
|
+
c;c;c
|
18
|
+
end
|
19
|
+
|
20
|
+
def b
|
21
|
+
sleep 0
|
22
|
+
end
|
23
|
+
|
24
|
+
def c
|
25
|
+
5.times{b}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class MultiPrinterTest < TestCase
|
30
|
+
def setup
|
31
|
+
# Need to use wall time for this test due to the sleep calls
|
32
|
+
RubyProf::measure_mode = RubyProf::WALL_TIME
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_refuses_io_objects
|
36
|
+
# we don't need a real profile for this test
|
37
|
+
p = RubyProf::MultiPrinter.new nil
|
38
|
+
begin
|
39
|
+
p.print(STDOUT)
|
40
|
+
flunk "should have raised an ArgumentError"
|
41
|
+
rescue ArgumentError => e
|
42
|
+
assert_match(/IO/, e.to_s)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_refuses_non_hashes
|
47
|
+
# we don't need a real profile for this test
|
48
|
+
p = RubyProf::MultiPrinter.new nil
|
49
|
+
begin
|
50
|
+
p.print([])
|
51
|
+
flunk "should have raised an ArgumentError"
|
52
|
+
rescue ArgumentError => e
|
53
|
+
assert_match(/hash/, e.to_s)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_all_profiles_can_be_created
|
58
|
+
start_time = Time.now
|
59
|
+
RubyProf.start
|
60
|
+
5.times{MSTPT.new.a}
|
61
|
+
result = RubyProf.stop
|
62
|
+
end_time = Time.now
|
63
|
+
expected_time = end_time - start_time
|
64
|
+
graph = print(result)[1]
|
65
|
+
re = Regexp.new('
|
66
|
+
\s*<table>
|
67
|
+
\s*<tr>
|
68
|
+
\s*<th>Thread ID</th>
|
69
|
+
\s*(<th>Fiber ID</th>)?
|
70
|
+
\s*<th>Total Time</th>
|
71
|
+
\s*</tr>
|
72
|
+
\s*
|
73
|
+
\s*<tr>
|
74
|
+
\s*(<td>([\.0-9]+)</td>)?
|
75
|
+
\s*<td><a href="#-?\d+">-?\d+</a></td>
|
76
|
+
\s*<td>([\.0-9e]+)</td>
|
77
|
+
\s*</tr>
|
78
|
+
\s*
|
79
|
+
\s*</table>')
|
80
|
+
assert_match(re, graph)
|
81
|
+
graph =~ re
|
82
|
+
display_time = $4.to_f
|
83
|
+
assert_in_delta expected_time, display_time, 0.001
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
def print(result)
|
89
|
+
test = caller.first =~ /in `(.*)'/ ? $1 : "test"
|
90
|
+
path = RubyProf.tmpdir
|
91
|
+
profile = "ruby_prof_#{test}"
|
92
|
+
printer = RubyProf::MultiPrinter.new(result)
|
93
|
+
printer.print(:path => path, :profile => profile,
|
94
|
+
:threshold => 0, :min_percent => 0, :title => "ruby_prof #{test}")
|
95
|
+
if RUBY_PLATFORM =~ /darwin/ && ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT']=="1"
|
96
|
+
system("open '#{printer.stack_profile}'")
|
97
|
+
end
|
98
|
+
# if GC.respond_to?(:dump_file_and_line_info)
|
99
|
+
# GC.start
|
100
|
+
# GC.dump_file_and_line_info("heap.dump")
|
101
|
+
# end
|
102
|
+
[File.read(printer.stack_profile), File.read(printer.graph_profile)]
|
103
|
+
end
|
104
|
+
end
|