ruby-prof 0.16.2 → 1.1.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.
Files changed (203) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES +532 -467
  3. data/LICENSE +24 -24
  4. data/README.rdoc +5 -454
  5. data/Rakefile +110 -113
  6. data/bin/ruby-prof +380 -340
  7. data/bin/ruby-prof-check-trace +45 -45
  8. data/ext/ruby_prof/extconf.rb +36 -64
  9. data/ext/ruby_prof/rp_allocation.c +279 -0
  10. data/ext/ruby_prof/rp_allocation.h +31 -0
  11. data/ext/ruby_prof/rp_call_info.c +271 -407
  12. data/ext/ruby_prof/rp_call_info.h +35 -48
  13. data/ext/ruby_prof/rp_measure_allocations.c +52 -76
  14. data/ext/ruby_prof/rp_measure_memory.c +42 -77
  15. data/ext/ruby_prof/rp_measure_process_time.c +67 -71
  16. data/ext/ruby_prof/rp_measure_wall_time.c +62 -45
  17. data/ext/ruby_prof/rp_measurement.c +230 -0
  18. data/ext/ruby_prof/rp_measurement.h +50 -0
  19. data/ext/ruby_prof/rp_method.c +630 -411
  20. data/ext/ruby_prof/rp_method.h +70 -52
  21. data/ext/ruby_prof/rp_profile.c +895 -0
  22. data/ext/ruby_prof/rp_profile.h +37 -0
  23. data/ext/ruby_prof/rp_stack.c +196 -128
  24. data/ext/ruby_prof/rp_stack.h +56 -51
  25. data/ext/ruby_prof/rp_thread.c +337 -273
  26. data/ext/ruby_prof/rp_thread.h +36 -27
  27. data/ext/ruby_prof/ruby_prof.c +48 -671
  28. data/ext/ruby_prof/ruby_prof.h +17 -56
  29. data/ext/ruby_prof/vc/ruby_prof.sln +20 -21
  30. data/ext/ruby_prof/vc/{ruby_prof_20.vcxproj → ruby_prof.vcxproj} +38 -5
  31. data/lib/ruby-prof.rb +52 -58
  32. data/lib/ruby-prof/assets/call_stack_printer.html.erb +713 -0
  33. data/lib/ruby-prof/assets/call_stack_printer.png +0 -0
  34. data/lib/ruby-prof/assets/graph_printer.html.erb +356 -0
  35. data/lib/ruby-prof/call_info.rb +57 -126
  36. data/lib/ruby-prof/call_info_visitor.rb +38 -40
  37. data/lib/ruby-prof/compatibility.rb +109 -178
  38. data/lib/ruby-prof/exclude_common_methods.rb +198 -0
  39. data/lib/ruby-prof/measurement.rb +14 -0
  40. data/lib/ruby-prof/method_info.rb +90 -129
  41. data/lib/ruby-prof/printers/abstract_printer.rb +127 -85
  42. data/lib/ruby-prof/printers/call_info_printer.rb +51 -41
  43. data/lib/ruby-prof/printers/call_stack_printer.rb +182 -260
  44. data/lib/ruby-prof/printers/call_tree_printer.rb +151 -130
  45. data/lib/ruby-prof/printers/dot_printer.rb +132 -132
  46. data/lib/ruby-prof/printers/flat_printer.rb +52 -70
  47. data/lib/ruby-prof/printers/graph_html_printer.rb +63 -244
  48. data/lib/ruby-prof/printers/graph_printer.rb +114 -116
  49. data/lib/ruby-prof/printers/multi_printer.rb +127 -58
  50. data/lib/ruby-prof/profile.rb +33 -55
  51. data/lib/ruby-prof/rack.rb +171 -95
  52. data/lib/ruby-prof/task.rb +147 -147
  53. data/lib/ruby-prof/thread.rb +35 -41
  54. data/lib/ruby-prof/version.rb +3 -3
  55. data/lib/unprof.rb +10 -10
  56. data/ruby-prof.gemspec +58 -57
  57. data/test/abstract_printer_test.rb +26 -0
  58. data/test/alias_test.rb +129 -0
  59. data/test/basic_test.rb +129 -128
  60. data/test/call_info_visitor_test.rb +31 -31
  61. data/test/duplicate_names_test.rb +32 -32
  62. data/test/dynamic_method_test.rb +53 -55
  63. data/test/enumerable_test.rb +21 -21
  64. data/test/exceptions_test.rb +24 -16
  65. data/test/exclude_methods_test.rb +146 -0
  66. data/test/exclude_threads_test.rb +53 -53
  67. data/test/fiber_test.rb +73 -79
  68. data/test/gc_test.rb +96 -0
  69. data/test/line_number_test.rb +161 -71
  70. data/test/marshal_test.rb +119 -0
  71. data/test/measure_allocations.rb +30 -0
  72. data/test/measure_allocations_test.rb +385 -26
  73. data/test/measure_allocations_trace_test.rb +385 -0
  74. data/test/measure_memory_trace_test.rb +756 -0
  75. data/test/measure_process_time_test.rb +849 -63
  76. data/test/measure_times.rb +54 -0
  77. data/test/measure_wall_time_test.rb +459 -255
  78. data/test/multi_printer_test.rb +71 -83
  79. data/test/no_method_class_test.rb +15 -15
  80. data/test/parser_timings.rb +24 -0
  81. data/test/pause_resume_test.rb +166 -166
  82. data/test/prime.rb +56 -54
  83. data/test/printer_call_stack_test.rb +28 -0
  84. data/test/printer_call_tree_test.rb +31 -0
  85. data/test/printer_flat_test.rb +68 -0
  86. data/test/printer_graph_html_test.rb +60 -0
  87. data/test/printer_graph_test.rb +41 -0
  88. data/test/printers_test.rb +141 -255
  89. data/test/printing_recursive_graph_test.rb +81 -127
  90. data/test/rack_test.rb +157 -93
  91. data/test/recursive_test.rb +210 -215
  92. data/test/singleton_test.rb +38 -38
  93. data/test/stack_printer_test.rb +64 -78
  94. data/test/start_stop_test.rb +109 -112
  95. data/test/test_helper.rb +24 -264
  96. data/test/thread_test.rb +144 -187
  97. data/test/unique_call_path_test.rb +190 -202
  98. data/test/yarv_test.rb +56 -55
  99. metadata +34 -114
  100. data/doc/LICENSE.html +0 -114
  101. data/doc/README_rdoc.html +0 -603
  102. data/doc/Rack.html +0 -95
  103. data/doc/Rack/RubyProf.html +0 -226
  104. data/doc/RubyProf.html +0 -962
  105. data/doc/RubyProf/AbstractPrinter.html +0 -546
  106. data/doc/RubyProf/AggregateCallInfo.html +0 -551
  107. data/doc/RubyProf/CallInfo.html +0 -639
  108. data/doc/RubyProf/CallInfoPrinter.html +0 -120
  109. data/doc/RubyProf/CallInfoVisitor.html +0 -198
  110. data/doc/RubyProf/CallStackPrinter.html +0 -1121
  111. data/doc/RubyProf/CallTreePrinter.html +0 -641
  112. data/doc/RubyProf/Cmd.html +0 -631
  113. data/doc/RubyProf/DotPrinter.html +0 -257
  114. data/doc/RubyProf/FlatPrinter.html +0 -163
  115. data/doc/RubyProf/FlatPrinterWithLineNumbers.html +0 -208
  116. data/doc/RubyProf/GraphHtmlPrinter.html +0 -552
  117. data/doc/RubyProf/GraphPrinter.html +0 -139
  118. data/doc/RubyProf/MethodInfo.html +0 -745
  119. data/doc/RubyProf/MultiPrinter.html +0 -360
  120. data/doc/RubyProf/Profile.html +0 -763
  121. data/doc/RubyProf/ProfileTask.html +0 -490
  122. data/doc/RubyProf/Thread.html +0 -310
  123. data/doc/created.rid +0 -31
  124. data/doc/css/fonts.css +0 -167
  125. data/doc/css/rdoc.css +0 -590
  126. data/doc/examples/flat_txt.html +0 -138
  127. data/doc/examples/graph_html.html +0 -909
  128. data/doc/examples/graph_txt.html +0 -247
  129. data/doc/fonts/Lato-Light.ttf +0 -0
  130. data/doc/fonts/Lato-LightItalic.ttf +0 -0
  131. data/doc/fonts/Lato-Regular.ttf +0 -0
  132. data/doc/fonts/Lato-RegularItalic.ttf +0 -0
  133. data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
  134. data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
  135. data/doc/images/add.png +0 -0
  136. data/doc/images/arrow_up.png +0 -0
  137. data/doc/images/brick.png +0 -0
  138. data/doc/images/brick_link.png +0 -0
  139. data/doc/images/bug.png +0 -0
  140. data/doc/images/bullet_black.png +0 -0
  141. data/doc/images/bullet_toggle_minus.png +0 -0
  142. data/doc/images/bullet_toggle_plus.png +0 -0
  143. data/doc/images/date.png +0 -0
  144. data/doc/images/delete.png +0 -0
  145. data/doc/images/find.png +0 -0
  146. data/doc/images/loadingAnimation.gif +0 -0
  147. data/doc/images/macFFBgHack.png +0 -0
  148. data/doc/images/package.png +0 -0
  149. data/doc/images/page_green.png +0 -0
  150. data/doc/images/page_white_text.png +0 -0
  151. data/doc/images/page_white_width.png +0 -0
  152. data/doc/images/plugin.png +0 -0
  153. data/doc/images/ruby.png +0 -0
  154. data/doc/images/tag_blue.png +0 -0
  155. data/doc/images/tag_green.png +0 -0
  156. data/doc/images/transparent.png +0 -0
  157. data/doc/images/wrench.png +0 -0
  158. data/doc/images/wrench_orange.png +0 -0
  159. data/doc/images/zoom.png +0 -0
  160. data/doc/index.html +0 -626
  161. data/doc/js/darkfish.js +0 -161
  162. data/doc/js/jquery.js +0 -4
  163. data/doc/js/navigation.js +0 -142
  164. data/doc/js/navigation.js.gz +0 -0
  165. data/doc/js/search.js +0 -109
  166. data/doc/js/search_index.js +0 -1
  167. data/doc/js/search_index.js.gz +0 -0
  168. data/doc/js/searcher.js +0 -228
  169. data/doc/js/searcher.js.gz +0 -0
  170. data/doc/table_of_contents.html +0 -942
  171. data/examples/cachegrind.out.1 +0 -114
  172. data/examples/cachegrind.out.1.32313213 +0 -114
  173. data/examples/flat.txt +0 -50
  174. data/examples/graph.dot +0 -84
  175. data/examples/graph.html +0 -823
  176. data/examples/graph.txt +0 -139
  177. data/examples/multi.flat.txt +0 -23
  178. data/examples/multi.graph.html +0 -760
  179. data/examples/multi.grind.dat +0 -114
  180. data/examples/multi.stack.html +0 -547
  181. data/examples/stack.html +0 -547
  182. data/ext/ruby_prof/rp_measure.c +0 -40
  183. data/ext/ruby_prof/rp_measure.h +0 -45
  184. data/ext/ruby_prof/rp_measure_cpu_time.c +0 -136
  185. data/ext/ruby_prof/rp_measure_gc_runs.c +0 -73
  186. data/ext/ruby_prof/rp_measure_gc_time.c +0 -60
  187. data/ext/ruby_prof/vc/ruby_prof_18.vcxproj +0 -108
  188. data/ext/ruby_prof/vc/ruby_prof_19.vcxproj +0 -110
  189. data/lib/ruby-prof/aggregate_call_info.rb +0 -76
  190. data/lib/ruby-prof/assets/call_stack_printer.css.html +0 -117
  191. data/lib/ruby-prof/assets/call_stack_printer.js.html +0 -385
  192. data/lib/ruby-prof/printers/flat_printer_with_line_numbers.rb +0 -64
  193. data/test/aggregate_test.rb +0 -136
  194. data/test/block_test.rb +0 -74
  195. data/test/call_info_test.rb +0 -78
  196. data/test/issue137_test.rb +0 -63
  197. data/test/measure_cpu_time_test.rb +0 -213
  198. data/test/measure_gc_runs_test.rb +0 -32
  199. data/test/measure_gc_time_test.rb +0 -36
  200. data/test/measure_memory_test.rb +0 -33
  201. data/test/method_elimination_test.rb +0 -84
  202. data/test/module_test.rb +0 -45
  203. data/test/stack_test.rb +0 -138
@@ -1,78 +1,64 @@
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 STPT
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 StackPrinterTest < 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_stack_can_be_printed
36
- start_time = Time.now
37
- RubyProf.start
38
- 5.times{STPT.new.a}
39
- result = RubyProf.stop
40
- end_time = Time.now
41
- expected_time = end_time - start_time
42
-
43
- file_contents = nil
44
- assert_nothing_raised { file_contents = print(result) }
45
- # TODO: why are thread ids negative on travis-ci.org (32 bit build maybe?)
46
- re = /Thread: (-?\d+)(, Fiber: (-?\d+))? \(100\.00% ~ ([\.0-9]+)\)/
47
- assert_match(re, file_contents)
48
- file_contents =~ re
49
- actual_time = $4.to_f
50
- assert_in_delta(expected_time, actual_time, 0.1)
51
- end
52
-
53
- def test_method_elimination
54
- RubyProf.start
55
- 5.times{STPT.new.a}
56
- result = RubyProf.stop
57
- assert_nothing_raised {
58
- # result.dump
59
- result.eliminate_methods!([/Integer#times/])
60
- # $stderr.puts "================================"
61
- # result.dump
62
- print(result)
63
- }
64
- end
65
-
66
- private
67
- def print(result)
68
- test = caller.first =~ /in `(.*)'/ ? $1 : "test"
69
- testfile_name = "#{RubyProf.tmpdir}/ruby_prof_#{test}.html"
70
- # puts "printing to #{testfile_name}"
71
- printer = RubyProf::CallStackPrinter.new(result)
72
- File.open(testfile_name, "w") {|f| printer.print(f, :threshold => 0, :min_percent => 0, :title => "ruby_prof #{test}")}
73
- system("open '#{testfile_name}'") if RUBY_PLATFORM =~ /darwin/ && ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT']=="1"
74
- assert File.exist?(testfile_name), "#{testfile_name} does not exist"
75
- assert File.readable?(testfile_name), "#{testfile_name} is no readable"
76
- File.read(testfile_name)
77
- end
78
- 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 STPT
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 StackPrinterTest < 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_stack_can_be_printed
36
+ start_time = Time.now
37
+ RubyProf.start
38
+ 5.times{STPT.new.a}
39
+ result = RubyProf.stop
40
+ end_time = Time.now
41
+ expected_time = end_time - start_time
42
+
43
+ file_contents = nil
44
+ file_contents = print(result)
45
+ re = /Thread: (\d+)(, Fiber: (\d+))? \([\.0-9]+.[\.0-9]+% ~ ([\.0-9]+)\)/
46
+ assert_match(re, file_contents)
47
+ file_contents =~ re
48
+ actual_time = $4.to_f
49
+ assert_in_delta(expected_time, actual_time, 0.1)
50
+ end
51
+
52
+ private
53
+ def print(result)
54
+ test = caller.first =~ /in `(.*)'/ ? $1 : "test"
55
+ testfile_name = "#{Dir.tmpdir}/ruby_prof_#{test}.html"
56
+ # puts "printing to #{testfile_name}"
57
+ printer = RubyProf::CallStackPrinter.new(result)
58
+ File.open(testfile_name, "w") {|f| printer.print(f, :threshold => 0, :min_percent => 0, :title => "ruby_prof #{test}")}
59
+ system("open '#{testfile_name}'") if RUBY_PLATFORM =~ /darwin/ && ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT']=="1"
60
+ assert File.exist?(testfile_name), "#{testfile_name} does not exist"
61
+ assert File.readable?(testfile_name), "#{testfile_name} is no readable"
62
+ File.read(testfile_name)
63
+ end
64
+ end
@@ -1,112 +1,109 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
-
6
- class StartStopTest < TestCase
7
- def setup
8
- # Need to use wall time for this test due to the sleep calls
9
- RubyProf::measure_mode = RubyProf::WALL_TIME
10
- end
11
-
12
- def method1
13
- RubyProf.start
14
- method2
15
- end
16
-
17
- def method2
18
- method3
19
- end
20
-
21
- def method3
22
- sleep(2)
23
- @result = RubyProf.stop
24
- end
25
-
26
- def test_extra_stop_should_raise
27
- RubyProf.start
28
- assert_raises(RuntimeError) do
29
- RubyProf.start
30
- end
31
-
32
- assert_raises(RuntimeError) do
33
- RubyProf.profile {}
34
- end
35
-
36
- RubyProf.stop # ok
37
- assert_raises(RuntimeError) do
38
- RubyProf.stop
39
- end
40
- end
41
-
42
-
43
- def test_different_methods
44
- method1
45
-
46
- # Ruby prof should be stopped
47
- assert_equal(false, RubyProf.running?)
48
-
49
-
50
- # Length should be 4:
51
- # StartStopTest#method1
52
- # StartStopTest#method2
53
- # StartStopTest#method3
54
- # Kernel#sleep
55
-
56
- methods = @result.threads.first.methods.sort.reverse
57
- assert_equal(4, methods.length)
58
-
59
- # Check StackTest#test_call_sequence
60
- method = methods[0]
61
- assert_equal('StartStopTest#method1', method.full_name)
62
- assert_equal(1, method.called)
63
- assert_in_delta(2, method.total_time, 0.05)
64
- assert_in_delta(0, method.wait_time, 0.02)
65
- assert_in_delta(0, method.self_time, 0.02)
66
- assert_in_delta(2, method.children_time, 0.05)
67
- assert_equal(1, method.call_infos.length)
68
-
69
- call_info = method.call_infos[0]
70
- assert_equal('StartStopTest#method1', call_info.call_sequence)
71
- assert_equal(1, call_info.children.length)
72
-
73
- method = methods[1]
74
- assert_equal('StartStopTest#method2', method.full_name)
75
- assert_equal(1, method.called)
76
- assert_in_delta(2, method.total_time, 0.05)
77
- assert_in_delta(0, method.wait_time, 0.02)
78
- assert_in_delta(0, method.self_time, 0.02)
79
- assert_in_delta(2, method.children_time, 0.05)
80
- assert_equal(1, method.call_infos.length)
81
-
82
- call_info = method.call_infos[0]
83
- assert_equal('StartStopTest#method1->StartStopTest#method2', call_info.call_sequence)
84
- assert_equal(1, call_info.children.length)
85
-
86
- method = methods[2]
87
- assert_equal('StartStopTest#method3', method.full_name)
88
- assert_equal(1, method.called)
89
- assert_in_delta(2, method.total_time, 0.02)
90
- assert_in_delta(0, method.wait_time, 0.02)
91
- assert_in_delta(0, method.self_time, 0.02)
92
- assert_in_delta(2, method.children_time, 0.02)
93
- assert_equal(1, method.call_infos.length)
94
-
95
- call_info = method.call_infos[0]
96
- assert_equal('StartStopTest#method1->StartStopTest#method2->StartStopTest#method3', call_info.call_sequence)
97
- assert_equal(1, call_info.children.length)
98
-
99
- method = methods[3]
100
- assert_equal('Kernel#sleep', method.full_name)
101
- assert_equal(1, method.called)
102
- assert_in_delta(2, method.total_time, 0.02)
103
- assert_in_delta(0, method.wait_time, 0.02)
104
- assert_in_delta(2, method.self_time, 0.02)
105
- assert_in_delta(0, method.children_time, 0.02)
106
- assert_equal(1, method.call_infos.length)
107
-
108
- call_info = method.call_infos[0]
109
- assert_equal('StartStopTest#method1->StartStopTest#method2->StartStopTest#method3->Kernel#sleep', call_info.call_sequence)
110
- assert_equal(0, call_info.children.length)
111
- end
112
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class StartStopTest < TestCase
7
+ def setup
8
+ # Need to use wall time for this test due to the sleep calls
9
+ RubyProf::measure_mode = RubyProf::WALL_TIME
10
+ end
11
+
12
+ def method1
13
+ RubyProf.start
14
+ method2
15
+ end
16
+
17
+ def method2
18
+ method3
19
+ end
20
+
21
+ def method3
22
+ sleep(2)
23
+ @result = RubyProf.stop
24
+ end
25
+
26
+ def test_extra_stop_should_raise
27
+ RubyProf.start
28
+ assert_raises(RuntimeError) do
29
+ RubyProf.start
30
+ end
31
+
32
+ assert_raises(RuntimeError) do
33
+ RubyProf.profile {}
34
+ end
35
+
36
+ RubyProf.stop # ok
37
+ assert_raises(RuntimeError) do
38
+ RubyProf.stop
39
+ end
40
+ end
41
+
42
+ def test_different_methods
43
+ method1
44
+
45
+ # Ruby prof should be stopped
46
+ assert_equal(false, RubyProf.running?)
47
+
48
+ methods = @result.threads.first.methods.sort.reverse
49
+ assert_equal(4, methods.length)
50
+
51
+ method = methods[0]
52
+ assert_equal('StartStopTest#method1', method.full_name)
53
+ assert_equal(1, method.called)
54
+ assert_in_delta(2, method.total_time, 0.05)
55
+ assert_in_delta(0, method.wait_time, 0.02)
56
+ assert_in_delta(0, method.self_time, 0.02)
57
+ assert_in_delta(2, method.children_time, 0.05)
58
+
59
+ assert_equal(1, method.callees.length)
60
+ call_info = method.callees[0]
61
+ assert_equal('StartStopTest#method2', call_info.target.full_name)
62
+
63
+ method = methods[1]
64
+ assert_equal('StartStopTest#method2', method.full_name)
65
+ assert_equal(1, method.called)
66
+ assert_in_delta(2, method.total_time, 0.05)
67
+ assert_in_delta(0, method.wait_time, 0.02)
68
+ assert_in_delta(0, method.self_time, 0.02)
69
+ assert_in_delta(2, method.children_time, 0.05)
70
+
71
+ assert_equal(1, method.callers.length)
72
+ call_info = method.callers[0]
73
+ assert_equal('StartStopTest#method1', call_info.parent.full_name)
74
+
75
+ assert_equal(1, method.callees.length)
76
+ call_info = method.callees[0]
77
+ assert_equal('StartStopTest#method3', call_info.target.full_name)
78
+
79
+ method = methods[2]
80
+ assert_equal('StartStopTest#method3', method.full_name)
81
+ assert_equal(1, method.called)
82
+ assert_in_delta(2, method.total_time, 0.02)
83
+ assert_in_delta(0, method.wait_time, 0.02)
84
+ assert_in_delta(0, method.self_time, 0.02)
85
+ assert_in_delta(2, method.children_time, 0.02)
86
+
87
+ assert_equal(1, method.callers.length)
88
+ call_info = method.callers[0]
89
+ assert_equal('StartStopTest#method2', call_info.parent.full_name)
90
+
91
+ assert_equal(1, method.callees.length)
92
+ call_info = method.callees[0]
93
+ assert_equal('Kernel#sleep', call_info.target.full_name)
94
+
95
+ method = methods[3]
96
+ assert_equal('Kernel#sleep', method.full_name)
97
+ assert_equal(1, method.called)
98
+ assert_in_delta(2, method.total_time, 0.02)
99
+ assert_in_delta(0, method.wait_time, 0.02)
100
+ assert_in_delta(2, method.self_time, 0.02)
101
+ assert_in_delta(0, method.children_time, 0.02)
102
+
103
+ assert_equal(1, method.callers.length)
104
+ call_info = method.callers[0]
105
+ assert_equal('StartStopTest#method3', call_info.parent.full_name)
106
+
107
+ assert_equal(0, method.callees.length)
108
+ end
109
+ end
@@ -1,264 +1,24 @@
1
- # encoding: UTF-8
2
-
3
- # Make RubyMine happy
4
- require "rubygems"
5
- gem "minitest"
6
-
7
- if ENV["RM_INFO"] || ENV["TEAMCITY_VERSION"]
8
- if RUBY_PLATFORM =~ /(win32|mingw)/
9
- gem "win32console"
10
- end
11
- gem "minitest-reporters"
12
- require 'minitest/reporters'
13
- MiniTest::Reporters.use!
14
- end
15
-
16
- require "minitest/pride" if RUBY_VERSION == "1.9.3"
17
-
18
- # To make testing/debugging easier, test within this source tree versus an installed gem
19
- dir = File.dirname(__FILE__)
20
- root = File.expand_path(File.join(dir, '..'))
21
- lib = File.expand_path(File.join(root, 'lib'))
22
- ext = File.expand_path(File.join(root, 'ext', 'ruby_prof'))
23
-
24
- $LOAD_PATH << lib
25
- $LOAD_PATH << ext
26
-
27
- require 'ruby-prof'
28
- require 'minitest/autorun'
29
-
30
- class TestCase < Minitest::Test
31
- # I know this sucks, but ...
32
- def assert_nothing_raised(*)
33
- yield
34
- end
35
-
36
- def before_setup
37
- # make sure to exclude all threads except the one running the test
38
- # minitest allocates a thread pool and they would otherwise show
39
- # up in the profile data, breaking tests randomly
40
- RubyProf.exclude_threads = Thread.list.select{|t| t != Thread.current}
41
- end
42
-
43
- def after_teardown
44
- # reset exclude threads after testing
45
- RubyProf.exclude_threads = nil
46
- end
47
- end
48
-
49
- require File.expand_path('../prime', __FILE__)
50
-
51
- # Some classes used in measurement tests
52
- module RubyProf
53
- class C1
54
- def C1.hello
55
- sleep(0.1)
56
- end
57
-
58
- def hello
59
- sleep(0.2)
60
- end
61
- end
62
-
63
- module M1
64
- def hello
65
- sleep(0.3)
66
- end
67
- end
68
-
69
- class C2
70
- include M1
71
- extend M1
72
- end
73
-
74
- class C3
75
- def hello
76
- sleep(0.4)
77
- end
78
- end
79
-
80
- module M4
81
- def hello
82
- sleep(0.5)
83
- end
84
- end
85
-
86
- module M5
87
- include M4
88
- def goodbye
89
- hello
90
- end
91
- end
92
-
93
- class C6
94
- include M5
95
- def test
96
- goodbye
97
- end
98
- end
99
-
100
- class C7
101
- def self.busy_wait
102
- t = Time.now.to_f
103
- while Time.now.to_f - t < 0.1; end
104
- end
105
-
106
- def self.sleep_wait
107
- sleep 0.1
108
- end
109
-
110
- def busy_wait
111
- t = Time.now.to_f
112
- while Time.now.to_f - t < 0.2; end
113
- end
114
-
115
- def sleep_wait
116
- sleep 0.2
117
- end
118
- end
119
-
120
- module M7
121
- def busy_wait
122
- t = Time.now.to_f
123
- while Time.now.to_f - t < 0.3; end
124
- end
125
-
126
- def sleep_wait
127
- sleep 0.3
128
- end
129
- end
130
-
131
- class C8
132
- include M7
133
- extend M7
134
- end
135
-
136
- def self.ruby_major_version
137
- match = RUBY_VERSION.match(/(\d)\.(\d)/)
138
- return Integer(match[1])
139
- end
140
-
141
- def self.ruby_minor_version
142
- match = RUBY_VERSION.match(/(\d)\.(\d)/)
143
- return Integer(match[2])
144
- end
145
-
146
- def self.parent_object
147
- if ruby_major_version == 1 && ruby_minor_version == 8
148
- Object
149
- else
150
- BasicObject
151
- end
152
- end
153
-
154
- def self.ruby_2?
155
- ruby_major_version == 2
156
- end
157
-
158
- # store printer output in this directory
159
- def self.tmpdir
160
- File.expand_path('../../tmp', __FILE__)
161
- end
162
- end
163
-
164
- module MemoryTestHelper
165
- def memory_test_helper
166
- result = RubyProf.profile {Array.new}
167
- total = result.threads.first.methods.inject(0) { |sum, m| sum + m.total_time }
168
- assert(total < 1_000_000, 'Total should not have subtract overflow error')
169
- total
170
- end
171
- end
172
-
173
- module PrinterTestHelper
174
- Metrics = Struct.new(:name, :total, :self_t, :wait, :child, :calls)
175
- class Metrics
176
- def pp
177
- "%s[total: %.2f, self: %.2f, wait: %.2f, child: %.2f, calls: %s]" %
178
- [name, total, self_t, wait, child, calls]
179
- end
180
- end
181
-
182
- Entry = Struct.new(:total_p, :self_p, :metrics, :parents, :children)
183
- class Entry
184
- def child(name)
185
- children.detect{|m| m.name == name}
186
- end
187
-
188
- def parent(name)
189
- parents.detect{|m| m.name == name}
190
- end
191
-
192
- def pp
193
- res = ""
194
- res << "NODE (total%%: %.2f, self%%: %.2f) %s\n" % [total_p, self_p, metrics.pp]
195
- res << " PARENTS:\n"
196
- parents.each {|m| res << " " + m.pp << "\n"}
197
- res << " CHILDREN:\n"
198
- children.each {|m| res << " " + m.pp << "\n"}
199
- res
200
- end
201
- end
202
-
203
- class MetricsArray < Array
204
- def metrics_for(name)
205
- detect {|e| e.metrics.name == name}
206
- end
207
-
208
- def pp(io = STDOUT)
209
- entries = map do |e|
210
- begin
211
- e.pp
212
- rescue
213
- puts $!.message + e.inspect
214
- ""
215
- end
216
- end
217
- io.puts entries.join("--------------------------------------------------\n")
218
- end
219
-
220
- def self.parse(str)
221
- res = new
222
- entry = nil
223
- relatives = []
224
- state = :preamble
225
-
226
- str.each_line do |l|
227
- line = l.chomp.strip
228
- if line =~ /-----/
229
- if state == :preamble
230
- state = :parsing_parents
231
- entry = Entry.new
232
- elsif state == :parsing_parents
233
- entry = Entry.new
234
- elsif state == :parsing_children
235
- entry.children = relatives
236
- res << entry
237
- entry = Entry.new
238
- relatives = []
239
- state = :parsing_parents
240
- end
241
- elsif line =~ /^\s*$/ || line =~ /indicates recursively called methods/
242
- next
243
- elsif state != :preamble
244
- elements = line.split(/\s+/)
245
- method = elements.pop
246
- numbers = elements[0..-2].map(&:to_f)
247
- metrics = Metrics.new(method, *numbers[-4..-1], elements[-1])
248
- if numbers.size == 6
249
- entry.metrics = metrics
250
- entry.total_p = numbers[0]
251
- entry.self_p = numbers[1]
252
- entry.parents = relatives
253
- entry.children = relatives = []
254
- state = :parsing_children
255
- res << entry
256
- else
257
- relatives << metrics
258
- end
259
- end
260
- end
261
- res
262
- end
263
- end
264
- end
1
+ # encoding: UTF-8
2
+
3
+ require "rubygems"
4
+ gem "minitest"
5
+ require 'singleton'
6
+
7
+ # To make testing/debugging easier, test within this source tree versus an installed gem
8
+ dir = File.dirname(__FILE__)
9
+ root = File.expand_path(File.join(dir, '..'))
10
+ lib = File.expand_path(File.join(root, 'lib'))
11
+ ext = File.expand_path(File.join(root, 'ext', 'ruby_prof'))
12
+
13
+ $LOAD_PATH << lib
14
+ $LOAD_PATH << ext
15
+
16
+ require 'ruby-prof'
17
+
18
+ # Disable minitest parallel tests. The problem is the thread switching will cahnge test results
19
+ # (self vs wait time)
20
+ ENV["N"] = "0"
21
+ require 'minitest/autorun'
22
+
23
+ class TestCase < Minitest::Test
24
+ end