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.
Files changed (185) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES +500 -482
  3. data/LICENSE +24 -24
  4. data/README.rdoc +487 -485
  5. data/Rakefile +113 -113
  6. data/bin/ruby-prof +345 -345
  7. data/bin/ruby-prof-check-trace +45 -45
  8. data/examples/flat.txt +50 -50
  9. data/examples/graph.dot +84 -84
  10. data/examples/graph.html +823 -823
  11. data/examples/graph.txt +139 -139
  12. data/examples/multi.flat.txt +23 -23
  13. data/examples/multi.graph.html +760 -760
  14. data/examples/multi.grind.dat +114 -114
  15. data/examples/multi.stack.html +547 -547
  16. data/examples/stack.html +547 -547
  17. data/ext/ruby_prof/extconf.rb +68 -68
  18. data/ext/ruby_prof/rp_call_info.c +425 -425
  19. data/ext/ruby_prof/rp_call_info.h +53 -53
  20. data/ext/ruby_prof/rp_measure.c +40 -40
  21. data/ext/ruby_prof/rp_measure.h +45 -45
  22. data/ext/ruby_prof/rp_measure_allocations.c +76 -76
  23. data/ext/ruby_prof/rp_measure_cpu_time.c +136 -136
  24. data/ext/ruby_prof/rp_measure_gc_runs.c +73 -73
  25. data/ext/ruby_prof/rp_measure_gc_time.c +60 -60
  26. data/ext/ruby_prof/rp_measure_memory.c +77 -77
  27. data/ext/ruby_prof/rp_measure_process_time.c +71 -71
  28. data/ext/ruby_prof/rp_measure_wall_time.c +45 -45
  29. data/ext/ruby_prof/rp_method.c +630 -636
  30. data/ext/ruby_prof/rp_method.h +75 -75
  31. data/ext/ruby_prof/rp_stack.c +173 -173
  32. data/ext/ruby_prof/rp_stack.h +63 -63
  33. data/ext/ruby_prof/rp_thread.c +277 -276
  34. data/ext/ruby_prof/rp_thread.h +27 -27
  35. data/ext/ruby_prof/ruby_prof.c +794 -774
  36. data/ext/ruby_prof/ruby_prof.h +60 -59
  37. data/ext/ruby_prof/vc/ruby_prof.sln +20 -21
  38. data/ext/ruby_prof/vc/{ruby_prof_20.vcxproj → ruby_prof.vcxproj} +31 -0
  39. data/lib/ruby-prof.rb +68 -68
  40. data/lib/ruby-prof/aggregate_call_info.rb +76 -76
  41. data/lib/ruby-prof/assets/call_stack_printer.css.html +116 -116
  42. data/lib/ruby-prof/assets/call_stack_printer.js.html +384 -384
  43. data/lib/ruby-prof/call_info.rb +115 -115
  44. data/lib/ruby-prof/call_info_visitor.rb +40 -40
  45. data/lib/ruby-prof/compatibility.rb +179 -178
  46. data/lib/ruby-prof/method_info.rb +121 -121
  47. data/lib/ruby-prof/printers/abstract_printer.rb +104 -103
  48. data/lib/ruby-prof/printers/call_info_printer.rb +41 -41
  49. data/lib/ruby-prof/printers/call_stack_printer.rb +265 -265
  50. data/lib/ruby-prof/printers/call_tree_printer.rb +143 -143
  51. data/lib/ruby-prof/printers/dot_printer.rb +132 -132
  52. data/lib/ruby-prof/printers/flat_printer.rb +70 -70
  53. data/lib/ruby-prof/printers/flat_printer_with_line_numbers.rb +83 -83
  54. data/lib/ruby-prof/printers/graph_html_printer.rb +249 -249
  55. data/lib/ruby-prof/printers/graph_printer.rb +116 -116
  56. data/lib/ruby-prof/printers/multi_printer.rb +84 -84
  57. data/lib/ruby-prof/profile.rb +26 -26
  58. data/lib/ruby-prof/profile/exclude_common_methods.rb +207 -201
  59. data/lib/ruby-prof/profile/legacy_method_elimination.rb +50 -49
  60. data/lib/ruby-prof/rack.rb +174 -174
  61. data/lib/ruby-prof/task.rb +147 -147
  62. data/lib/ruby-prof/thread.rb +35 -35
  63. data/lib/ruby-prof/version.rb +3 -3
  64. data/lib/unprof.rb +10 -10
  65. data/ruby-prof.gemspec +58 -58
  66. data/test/abstract_printer_test.rb +53 -0
  67. data/test/aggregate_test.rb +136 -136
  68. data/test/basic_test.rb +128 -128
  69. data/test/block_test.rb +74 -74
  70. data/test/call_info_test.rb +78 -78
  71. data/test/call_info_visitor_test.rb +31 -31
  72. data/test/duplicate_names_test.rb +32 -32
  73. data/test/dynamic_method_test.rb +55 -55
  74. data/test/enumerable_test.rb +21 -21
  75. data/test/exceptions_test.rb +24 -16
  76. data/test/exclude_methods_test.rb +146 -146
  77. data/test/exclude_threads_test.rb +53 -53
  78. data/test/fiber_test.rb +79 -79
  79. data/test/issue137_test.rb +63 -63
  80. data/test/line_number_test.rb +80 -80
  81. data/test/measure_allocations_test.rb +26 -26
  82. data/test/measure_cpu_time_test.rb +212 -213
  83. data/test/measure_gc_runs_test.rb +32 -32
  84. data/test/measure_gc_time_test.rb +36 -36
  85. data/test/measure_memory_test.rb +33 -33
  86. data/test/measure_process_time_test.rb +61 -63
  87. data/test/measure_wall_time_test.rb +255 -255
  88. data/test/method_elimination_test.rb +84 -84
  89. data/test/module_test.rb +45 -45
  90. data/test/multi_printer_test.rb +104 -104
  91. data/test/no_method_class_test.rb +15 -15
  92. data/test/pause_resume_test.rb +166 -166
  93. data/test/prime.rb +54 -54
  94. data/test/printers_test.rb +275 -275
  95. data/test/printing_recursive_graph_test.rb +127 -127
  96. data/test/rack_test.rb +157 -157
  97. data/test/recursive_test.rb +215 -215
  98. data/test/singleton_test.rb +38 -38
  99. data/test/stack_printer_test.rb +77 -78
  100. data/test/stack_test.rb +138 -138
  101. data/test/start_stop_test.rb +112 -112
  102. data/test/test_helper.rb +267 -275
  103. data/test/thread_test.rb +187 -187
  104. data/test/unique_call_path_test.rb +202 -202
  105. data/test/yarv_test.rb +55 -55
  106. metadata +17 -96
  107. data/doc/LICENSE.html +0 -115
  108. data/doc/README_rdoc.html +0 -637
  109. data/doc/Rack.html +0 -96
  110. data/doc/Rack/RubyProf.html +0 -233
  111. data/doc/Rack/RubyProf/RackProfiler.html +0 -343
  112. data/doc/RubyProf.html +0 -974
  113. data/doc/RubyProf/AbstractPrinter.html +0 -625
  114. data/doc/RubyProf/AggregateCallInfo.html +0 -552
  115. data/doc/RubyProf/CallInfo.html +0 -579
  116. data/doc/RubyProf/CallInfoPrinter.html +0 -121
  117. data/doc/RubyProf/CallInfoVisitor.html +0 -199
  118. data/doc/RubyProf/CallStackPrinter.html +0 -1127
  119. data/doc/RubyProf/CallTreePrinter.html +0 -725
  120. data/doc/RubyProf/Cmd.html +0 -637
  121. data/doc/RubyProf/DeprecationWarnings.html +0 -148
  122. data/doc/RubyProf/DotPrinter.html +0 -258
  123. data/doc/RubyProf/FlatPrinter.html +0 -164
  124. data/doc/RubyProf/FlatPrinterWithLineNumbers.html +0 -210
  125. data/doc/RubyProf/GraphHtmlPrinter.html +0 -558
  126. data/doc/RubyProf/GraphPrinter.html +0 -140
  127. data/doc/RubyProf/MethodInfo.html +0 -676
  128. data/doc/RubyProf/MultiPrinter.html +0 -574
  129. data/doc/RubyProf/Profile.html +0 -908
  130. data/doc/RubyProf/Profile/ExcludeCommonMethods.html +0 -411
  131. data/doc/RubyProf/Profile/LegacyMethodElimination.html +0 -158
  132. data/doc/RubyProf/ProfileTask.html +0 -491
  133. data/doc/RubyProf/Thread.html +0 -275
  134. data/doc/created.rid +0 -33
  135. data/doc/css/fonts.css +0 -167
  136. data/doc/css/rdoc.css +0 -590
  137. data/doc/examples/flat_txt.html +0 -139
  138. data/doc/examples/graph_html.html +0 -910
  139. data/doc/examples/graph_txt.html +0 -248
  140. data/doc/fonts/Lato-Light.ttf +0 -0
  141. data/doc/fonts/Lato-LightItalic.ttf +0 -0
  142. data/doc/fonts/Lato-Regular.ttf +0 -0
  143. data/doc/fonts/Lato-RegularItalic.ttf +0 -0
  144. data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
  145. data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
  146. data/doc/images/add.png +0 -0
  147. data/doc/images/arrow_up.png +0 -0
  148. data/doc/images/brick.png +0 -0
  149. data/doc/images/brick_link.png +0 -0
  150. data/doc/images/bug.png +0 -0
  151. data/doc/images/bullet_black.png +0 -0
  152. data/doc/images/bullet_toggle_minus.png +0 -0
  153. data/doc/images/bullet_toggle_plus.png +0 -0
  154. data/doc/images/date.png +0 -0
  155. data/doc/images/delete.png +0 -0
  156. data/doc/images/find.png +0 -0
  157. data/doc/images/loadingAnimation.gif +0 -0
  158. data/doc/images/macFFBgHack.png +0 -0
  159. data/doc/images/package.png +0 -0
  160. data/doc/images/page_green.png +0 -0
  161. data/doc/images/page_white_text.png +0 -0
  162. data/doc/images/page_white_width.png +0 -0
  163. data/doc/images/plugin.png +0 -0
  164. data/doc/images/ruby.png +0 -0
  165. data/doc/images/tag_blue.png +0 -0
  166. data/doc/images/tag_green.png +0 -0
  167. data/doc/images/transparent.png +0 -0
  168. data/doc/images/wrench.png +0 -0
  169. data/doc/images/wrench_orange.png +0 -0
  170. data/doc/images/zoom.png +0 -0
  171. data/doc/index.html +0 -666
  172. data/doc/js/darkfish.js +0 -161
  173. data/doc/js/jquery.js +0 -4
  174. data/doc/js/navigation.js +0 -142
  175. data/doc/js/navigation.js.gz +0 -0
  176. data/doc/js/search.js +0 -109
  177. data/doc/js/search_index.js +0 -1
  178. data/doc/js/search_index.js.gz +0 -0
  179. data/doc/js/searcher.js +0 -229
  180. data/doc/js/searcher.js.gz +0 -0
  181. data/doc/table_of_contents.html +0 -1052
  182. data/examples/cachegrind.out.1 +0 -114
  183. data/examples/cachegrind.out.1.32313213 +0 -114
  184. data/ext/ruby_prof/vc/ruby_prof_18.vcxproj +0 -108
  185. data/ext/ruby_prof/vc/ruby_prof_19.vcxproj +0 -110
@@ -1,115 +1,115 @@
1
- # encoding: utf-8
2
-
3
- module RubyProf
4
- class CallInfo
5
- # part of this class is defined in C code.
6
- # it provides the following attributes pertaining to tree structure:
7
- # depth: tree level (0 == root)
8
- # parent: parent call info (can be nil)
9
- # children: array of call info children (can be empty)
10
- # target: method info (containing an array of call infos)
11
-
12
- def children_time
13
- children.inject(0) do |sum, call_info|
14
- sum += call_info.total_time
15
- end
16
- end
17
-
18
- def stack
19
- @stack ||= begin
20
- methods = Array.new
21
- call_info = self
22
-
23
- while call_info
24
- methods << call_info.target
25
- call_info = call_info.parent
26
- end
27
- methods.reverse
28
- end
29
- end
30
-
31
- def call_sequence
32
- @call_sequence ||= begin
33
- stack.map {|method| method.full_name}.join('->')
34
- end
35
- end
36
-
37
- def root?
38
- self.parent.nil?
39
- end
40
-
41
- def descendent_of(other)
42
- p = self.parent
43
- while p && p != other && p.depth > other.depth
44
- p = p.parent
45
- end
46
- p == other
47
- end
48
-
49
- def self.roots_of(call_infos)
50
- roots = []
51
- sorted = call_infos.sort_by(&:depth).reverse
52
- while call_info = sorted.shift
53
- roots << call_info unless sorted.any?{|p| call_info.descendent_of(p)}
54
- end
55
- roots
56
- end
57
-
58
- def to_s
59
- "#{target.full_name} (c: #{called}, tt: #{total_time}, st: #{self_time}, ct: #{children_time})"
60
- end
61
-
62
- def inspect
63
- super + "(#{target.full_name}, d: #{depth}, c: #{called}, tt: #{total_time}, st: #{self_time}, ct: #{children_time})"
64
- end
65
-
66
- # eliminate call info from the call tree.
67
- # adds self and wait time to parent and attaches called methods to parent.
68
- # merges call trees for methods called from both praent end self.
69
- def eliminate!
70
- # puts "eliminating #{self}"
71
- return unless parent
72
- parent.add_self_time(self)
73
- parent.add_wait_time(self)
74
- children.each do |kid|
75
- if call = parent.find_call(kid)
76
- call.merge_call_tree(kid)
77
- else
78
- parent.children << kid
79
- # $stderr.puts "setting parent of #{kid}\nto #{parent}"
80
- kid.parent = parent
81
- end
82
- end
83
- parent.children.delete(self)
84
- end
85
-
86
- # find a specific call in list of children. returns nil if not found.
87
- # note: there can't be more than one child with a given target method. in other words:
88
- # x.children.grep{|y|y.target==m}.size <= 1 for all method infos m and call infos x
89
- def find_call(other)
90
- matching = children.select { |kid| kid.target == other.target }
91
- raise "inconsistent call tree" unless matching.size <= 1
92
- matching.first
93
- end
94
-
95
- # merge two call trees. adds self, wait, and total time of other to self and merges children of other into children of self.
96
- def merge_call_tree(other)
97
- # $stderr.puts "merging #{self}\nand #{other}"
98
- self.called += other.called
99
- add_self_time(other)
100
- add_wait_time(other)
101
- add_total_time(other)
102
- other.children.each do |other_kid|
103
- if kid = find_call(other_kid)
104
- # $stderr.puts "merging kids"
105
- kid.merge_call_tree(other_kid)
106
- else
107
- other_kid.parent = self
108
- children << other_kid
109
- end
110
- end
111
- other.children.clear
112
- other.target.call_infos.delete(other)
113
- end
114
- end
115
- end
1
+ # encoding: utf-8
2
+
3
+ module RubyProf
4
+ class CallInfo
5
+ # part of this class is defined in C code.
6
+ # it provides the following attributes pertaining to tree structure:
7
+ # depth: tree level (0 == root)
8
+ # parent: parent call info (can be nil)
9
+ # children: array of call info children (can be empty)
10
+ # target: method info (containing an array of call infos)
11
+
12
+ def children_time
13
+ children.inject(0) do |sum, call_info|
14
+ sum += call_info.total_time
15
+ end
16
+ end
17
+
18
+ def stack
19
+ @stack ||= begin
20
+ methods = Array.new
21
+ call_info = self
22
+
23
+ while call_info
24
+ methods << call_info.target
25
+ call_info = call_info.parent
26
+ end
27
+ methods.reverse
28
+ end
29
+ end
30
+
31
+ def call_sequence
32
+ @call_sequence ||= begin
33
+ stack.map {|method| method.full_name}.join('->')
34
+ end
35
+ end
36
+
37
+ def root?
38
+ self.parent.nil?
39
+ end
40
+
41
+ def descendent_of(other)
42
+ p = self.parent
43
+ while p && p != other && p.depth > other.depth
44
+ p = p.parent
45
+ end
46
+ p == other
47
+ end
48
+
49
+ def self.roots_of(call_infos)
50
+ roots = []
51
+ sorted = call_infos.sort_by(&:depth).reverse
52
+ while call_info = sorted.shift
53
+ roots << call_info unless sorted.any?{|p| call_info.descendent_of(p)}
54
+ end
55
+ roots
56
+ end
57
+
58
+ def to_s
59
+ "#{target.full_name} (c: #{called}, tt: #{total_time}, st: #{self_time}, ct: #{children_time})"
60
+ end
61
+
62
+ def inspect
63
+ super + "(#{target.full_name}, d: #{depth}, c: #{called}, tt: #{total_time}, st: #{self_time}, ct: #{children_time})"
64
+ end
65
+
66
+ # eliminate call info from the call tree.
67
+ # adds self and wait time to parent and attaches called methods to parent.
68
+ # merges call trees for methods called from both praent end self.
69
+ def eliminate!
70
+ # puts "eliminating #{self}"
71
+ return unless parent
72
+ parent.add_self_time(self)
73
+ parent.add_wait_time(self)
74
+ children.each do |kid|
75
+ if call = parent.find_call(kid)
76
+ call.merge_call_tree(kid)
77
+ else
78
+ parent.children << kid
79
+ # $stderr.puts "setting parent of #{kid}\nto #{parent}"
80
+ kid.parent = parent
81
+ end
82
+ end
83
+ parent.children.delete(self)
84
+ end
85
+
86
+ # find a specific call in list of children. returns nil if not found.
87
+ # note: there can't be more than one child with a given target method. in other words:
88
+ # x.children.grep{|y|y.target==m}.size <= 1 for all method infos m and call infos x
89
+ def find_call(other)
90
+ matching = children.select { |kid| kid.target == other.target }
91
+ raise "inconsistent call tree" unless matching.size <= 1
92
+ matching.first
93
+ end
94
+
95
+ # merge two call trees. adds self, wait, and total time of other to self and merges children of other into children of self.
96
+ def merge_call_tree(other)
97
+ # $stderr.puts "merging #{self}\nand #{other}"
98
+ self.called += other.called
99
+ add_self_time(other)
100
+ add_wait_time(other)
101
+ add_total_time(other)
102
+ other.children.each do |other_kid|
103
+ if kid = find_call(other_kid)
104
+ # $stderr.puts "merging kids"
105
+ kid.merge_call_tree(other_kid)
106
+ else
107
+ other_kid.parent = self
108
+ children << other_kid
109
+ end
110
+ end
111
+ other.children.clear
112
+ other.target.call_infos.delete(other)
113
+ end
114
+ end
115
+ end
@@ -1,40 +1,40 @@
1
- # The call info visitor class does a depth-first traversal across a
2
- # list of method infos. At each call_info node, the visitor executes
3
- # the block provided in the #visit method. The block is passed two
4
- # parameters, the event and the call_info instance. Event will be
5
- # either :enter or :exit.
6
- #
7
- # visitor = RubyProf::CallInfoVisitor.new(result.threads.first.top_call_infos)
8
- #
9
- # method_names = Array.new
10
- #
11
- # visitor.visit do |call_info, event|
12
- # method_names << call_info.target.full_name if event == :enter
13
- # end
14
- #
15
- # puts method_names
16
-
17
- module RubyProf
18
- class CallInfoVisitor
19
-
20
- def initialize(call_infos)
21
- @call_infos = CallInfo.roots_of(call_infos)
22
- end
23
-
24
- def visit(&block)
25
- @call_infos.each do |call_info|
26
- visit_call_info(call_info, &block)
27
- end
28
- end
29
-
30
- private
31
- def visit_call_info(call_info, &block)
32
- yield call_info, :enter
33
- call_info.children.each do |child|
34
- visit_call_info(child, &block)
35
- end
36
- yield call_info, :exit
37
- end
38
- end
39
-
40
- end
1
+ # The call info visitor class does a depth-first traversal across a
2
+ # list of method infos. At each call_info node, the visitor executes
3
+ # the block provided in the #visit method. The block is passed two
4
+ # parameters, the event and the call_info instance. Event will be
5
+ # either :enter or :exit.
6
+ #
7
+ # visitor = RubyProf::CallInfoVisitor.new(result.threads.first.top_call_infos)
8
+ #
9
+ # method_names = Array.new
10
+ #
11
+ # visitor.visit do |call_info, event|
12
+ # method_names << call_info.target.full_name if event == :enter
13
+ # end
14
+ #
15
+ # puts method_names
16
+
17
+ module RubyProf
18
+ class CallInfoVisitor
19
+
20
+ def initialize(call_infos)
21
+ @call_infos = CallInfo.roots_of(call_infos)
22
+ end
23
+
24
+ def visit(&block)
25
+ @call_infos.each do |call_info|
26
+ visit_call_info(call_info, &block)
27
+ end
28
+ end
29
+
30
+ private
31
+ def visit_call_info(call_info, &block)
32
+ yield call_info, :enter
33
+ call_info.children.each do |child|
34
+ visit_call_info(child, &block)
35
+ end
36
+ yield call_info, :exit
37
+ end
38
+ end
39
+
40
+ end
@@ -1,178 +1,179 @@
1
- # encoding: utf-8
2
-
3
- # These methods are here for backwards compatability with previous RubyProf releases
4
- module RubyProf
5
- # Measurements
6
- def self.cpu_frequency
7
- Measure::CpuTime.frequency
8
- end
9
-
10
- def self.measure_allocations
11
- Measure::Allocations.measure
12
- end
13
-
14
- def self.measure_cpu_time
15
- Measure::CpuTime.measure
16
- end
17
-
18
- def self.measure_gc_runs
19
- Measure::GcRuns.measure
20
- end
21
-
22
- def self.measure_gc_time
23
- Measure::GcTime.measure
24
- end
25
-
26
- def self.measure_memory
27
- Measure::Memory.measure
28
- end
29
-
30
- def self.measure_process_time
31
- Measure::ProcessTime.measure
32
- end
33
-
34
- def self.measure_wall_time
35
- Measure::WallTime.measure
36
- end
37
-
38
- # call-seq:
39
- # measure_mode -> measure_mode
40
- #
41
- # Returns what ruby-prof is measuring. Valid values include:
42
- #
43
- # *RubyProf::WALL_TIME - Measure wall time using gettimeofday on Linx and GetLocalTime on Windows. This is default.
44
- # *RubyProf::PROCESS_TIME - Measure process time. It is implemented using the clock functions in the C Runtime library.
45
- # *RubyProf::CPU_TIME - Measure time using the CPU clock counter. This mode is only supported on Pentium or PowerPC platforms.
46
- # *RubyProf::ALLOCATIONS - Measure object allocations. This requires a patched Ruby interpreter.
47
- # *RubyProf::MEMORY - Measure memory size. This requires a patched Ruby interpreter.
48
- # *RubyProf::GC_RUNS - Measure number of garbage collections. This requires a patched Ruby interpreter.
49
- # *RubyProf::GC_TIME - Measure time spent doing garbage collection. This requires a patched Ruby interpreter.*/
50
-
51
- def self.measure_mode
52
- @measure_mode ||= RubyProf::WALL_TIME
53
- end
54
-
55
- # call-seq:
56
- # measure_mode=value -> void
57
- #
58
- # Specifies what ruby-prof should measure. Valid values include:
59
- #
60
- # *RubyProf::WALL_TIME - Measure wall time using gettimeofday on Linx and GetLocalTime on Windows. This is default.
61
- # *RubyProf::PROCESS_TIME - Measure process time. It is implemented using the clock functions in the C Runtime library.
62
- # *RubyProf::CPU_TIME - Measure time using the CPU clock counter. This mode is only supported on Pentium or PowerPC platforms.
63
- # *RubyProf::ALLOCATIONS - Measure object allocations. This requires a patched Ruby interpreter.
64
- # *RubyProf::MEMORY - Measure memory size. This requires a patched Ruby interpreter.
65
- # *RubyProf::GC_RUNS - Measure number of garbage collections. This requires a patched Ruby interpreter.
66
- # *RubyProf::GC_TIME - Measure time spent doing garbage collection. This requires a patched Ruby interpreter.*/
67
- def self.measure_mode=(value)
68
- @measure_mode = value
69
- end
70
-
71
- def self.measure_mode_string
72
- case measure_mode
73
- when WALL_TIME then "wall_time"
74
- when CPU_TIME then "cpu_time"
75
- when PROCESS_TIME then "process_time_time"
76
- when ALLOCATIONS then "allocations"
77
- when MEMORY then "memory"
78
- when GC_TIME then "gc_time"
79
- when GC_RUNS then "gc_runs"
80
- end
81
- end
82
-
83
- # call-seq:
84
- # exclude_threads -> exclude_threads
85
- #
86
- # Returns threads ruby-prof should exclude from profiling
87
-
88
- def self.exclude_threads
89
- @exclude_threads ||= Array.new
90
- end
91
-
92
- # call-seq:
93
- # exclude_threads= -> void
94
- #
95
- # Specifies what threads ruby-prof should exclude from profiling
96
-
97
- def self.exclude_threads=(value)
98
- @exclude_threads = value
99
- end
100
-
101
- # Profiling
102
- def self.start_script(script)
103
- start
104
- load script
105
- end
106
-
107
- def self.start
108
- ensure_not_running!
109
- @profile = Profile.new(measure_mode: measure_mode, exclude_threads: exclude_threads)
110
- enable_gc_stats_if_needed
111
- @profile.start
112
- end
113
-
114
- def self.pause
115
- ensure_running!
116
- disable_gc_stats_if_needed
117
- @profile.pause
118
- end
119
-
120
- def self.running?
121
- if defined?(@profile) and @profile
122
- @profile.running?
123
- else
124
- false
125
- end
126
- end
127
-
128
- def self.resume
129
- ensure_running!
130
- enable_gc_stats_if_needed
131
- @profile.resume
132
- end
133
-
134
- def self.stop
135
- ensure_running!
136
- result = @profile.stop
137
- disable_gc_stats_if_needed
138
- @profile = nil
139
- result
140
- end
141
-
142
- # Profile a block
143
- def self.profile(options = {}, &block)
144
- ensure_not_running!
145
- gc_stat_was_enabled = enable_gc_stats_if_needed
146
- options = { measure_mode: measure_mode, exclude_threads: exclude_threads }.merge!(options)
147
- result = Profile.profile(options, &block)
148
- disable_gc_stats_if_needed(gc_stat_was_enabled)
149
- result
150
- end
151
-
152
-
153
- private
154
- def self.ensure_running!
155
- raise(RuntimeError, "RubyProf.start was not yet called") unless running?
156
- end
157
-
158
- def self.ensure_not_running!
159
- raise(RuntimeError, "RubyProf is already running") if running?
160
- end
161
-
162
- # for GC.allocated_size to work GC statistics should be enabled
163
- def self.enable_gc_stats_if_needed
164
- if measure_mode_requires_gc_stats_enabled?
165
- @gc_stat_was_enabled = GC.enable_stats
166
- end
167
- end
168
-
169
- def self.disable_gc_stats_if_needed(was_enabled=nil)
170
- was_enabled ||= defined?(@gc_stat_was_enabled) && @gc_stat_was_enabled
171
- GC.disable_stats if measure_mode_requires_gc_stats_enabled? && !was_enabled
172
- end
173
-
174
- def self.measure_mode_requires_gc_stats_enabled?
175
- GC.respond_to?(:enable_stats) &&
176
- [RubyProf::MEMORY, RubyProf::GC_TIME, RubyProf::GC_RUNS].include?(measure_mode)
177
- end
178
- end
1
+ # encoding: utf-8
2
+
3
+ # These methods are here for backwards compatability with previous RubyProf releases
4
+ module RubyProf
5
+ # Measurements
6
+ def self.cpu_frequency
7
+ Measure::CpuTime.frequency
8
+ end
9
+
10
+ def self.measure_allocations
11
+ Measure::Allocations.measure
12
+ end
13
+
14
+ def self.measure_cpu_time
15
+ Measure::CpuTime.measure
16
+ end
17
+
18
+ def self.measure_gc_runs
19
+ Measure::GcRuns.measure
20
+ end
21
+
22
+ def self.measure_gc_time
23
+ Measure::GcTime.measure
24
+ end
25
+
26
+ def self.measure_memory
27
+ Measure::Memory.measure
28
+ end
29
+
30
+ def self.measure_process_time
31
+ Measure::ProcessTime.measure
32
+ end
33
+
34
+ def self.measure_wall_time
35
+ Measure::WallTime.measure
36
+ end
37
+
38
+ # call-seq:
39
+ # measure_mode -> measure_mode
40
+ #
41
+ # Returns what ruby-prof is measuring. Valid values include:
42
+ #
43
+ # *RubyProf::WALL_TIME - Measure wall time using gettimeofday on Linx and GetLocalTime on Windows. This is default.
44
+ # *RubyProf::PROCESS_TIME - Measure process time. It is implemented using the clock functions in the C Runtime library.
45
+ # *RubyProf::CPU_TIME - Measure time using the CPU clock counter. This mode is only supported on Pentium or PowerPC platforms.
46
+ # *RubyProf::ALLOCATIONS - Measure object allocations. This requires a patched Ruby interpreter.
47
+ # *RubyProf::MEMORY - Measure memory size. This requires a patched Ruby interpreter.
48
+ # *RubyProf::GC_RUNS - Measure number of garbage collections. This requires a patched Ruby interpreter.
49
+ # *RubyProf::GC_TIME - Measure time spent doing garbage collection. This requires a patched Ruby interpreter.*/
50
+
51
+ def self.measure_mode
52
+ @measure_mode ||= RubyProf::WALL_TIME
53
+ end
54
+
55
+ # call-seq:
56
+ # measure_mode=value -> void
57
+ #
58
+ # Specifies what ruby-prof should measure. Valid values include:
59
+ #
60
+ # *RubyProf::WALL_TIME - Measure wall time using gettimeofday on Linx and GetLocalTime on Windows. This is default.
61
+ # *RubyProf::PROCESS_TIME - Measure process time. It is implemented using the clock functions in the C Runtime library.
62
+ # *RubyProf::CPU_TIME - Measure time using the CPU clock counter. This mode is only supported on Pentium or PowerPC platforms.
63
+ # *RubyProf::ALLOCATIONS - Measure object allocations. This requires a patched Ruby interpreter.
64
+ # *RubyProf::MEMORY - Measure memory size. This requires a patched Ruby interpreter.
65
+ # *RubyProf::GC_RUNS - Measure number of garbage collections. This requires a patched Ruby interpreter.
66
+ # *RubyProf::GC_TIME - Measure time spent doing garbage collection. This requires a patched Ruby interpreter.*/
67
+ def self.measure_mode=(value)
68
+ @measure_mode = value
69
+ end
70
+
71
+ def self.measure_mode_string
72
+ case measure_mode
73
+ when WALL_TIME then "wall_time"
74
+ when CPU_TIME then "cpu_time"
75
+ when PROCESS_TIME then "process_time_time"
76
+ when ALLOCATIONS then "allocations"
77
+ when MEMORY then "memory"
78
+ when GC_TIME then "gc_time"
79
+ when GC_RUNS then "gc_runs"
80
+ end
81
+ end
82
+
83
+ # call-seq:
84
+ # exclude_threads -> exclude_threads
85
+ #
86
+ # Returns threads ruby-prof should exclude from profiling
87
+
88
+ def self.exclude_threads
89
+ @exclude_threads ||= Array.new
90
+ end
91
+
92
+ # call-seq:
93
+ # exclude_threads= -> void
94
+ #
95
+ # Specifies what threads ruby-prof should exclude from profiling
96
+
97
+ def self.exclude_threads=(value)
98
+ @exclude_threads = value
99
+ end
100
+
101
+ # Profiling
102
+ def self.start_script(script)
103
+ start
104
+ load script
105
+ end
106
+
107
+ def self.start
108
+ ensure_not_running!
109
+ @profile = Profile.new(measure_mode: measure_mode, exclude_threads: exclude_threads)
110
+ enable_gc_stats_if_needed
111
+ @profile.start
112
+ end
113
+
114
+ def self.pause
115
+ ensure_running!
116
+ disable_gc_stats_if_needed
117
+ @profile.pause
118
+ end
119
+
120
+ def self.running?
121
+ if defined?(@profile) and @profile
122
+ @profile.running?
123
+ else
124
+ false
125
+ end
126
+ end
127
+
128
+ def self.resume
129
+ ensure_running!
130
+ enable_gc_stats_if_needed
131
+ @profile.resume
132
+ end
133
+
134
+ def self.stop
135
+ ensure_running!
136
+ result = @profile.stop
137
+ disable_gc_stats_if_needed
138
+ @profile = nil
139
+ result
140
+ end
141
+
142
+ # Profile a block
143
+ def self.profile(options = {}, &block)
144
+ ensure_not_running!
145
+ gc_stat_was_enabled = enable_gc_stats_if_needed
146
+ options = { measure_mode: measure_mode, exclude_threads: exclude_threads }.merge!(options)
147
+ result = Profile.profile(options, &block)
148
+ ensure
149
+ disable_gc_stats_if_needed(gc_stat_was_enabled)
150
+ result
151
+ end
152
+
153
+
154
+ private
155
+ def self.ensure_running!
156
+ raise(RuntimeError, "RubyProf.start was not yet called") unless running?
157
+ end
158
+
159
+ def self.ensure_not_running!
160
+ raise(RuntimeError, "RubyProf is already running") if running?
161
+ end
162
+
163
+ # for GC.allocated_size to work GC statistics should be enabled
164
+ def self.enable_gc_stats_if_needed
165
+ if measure_mode_requires_gc_stats_enabled?
166
+ @gc_stat_was_enabled = GC.enable_stats
167
+ end
168
+ end
169
+
170
+ def self.disable_gc_stats_if_needed(was_enabled=nil)
171
+ was_enabled ||= defined?(@gc_stat_was_enabled) && @gc_stat_was_enabled
172
+ GC.disable_stats if measure_mode_requires_gc_stats_enabled? && !was_enabled
173
+ end
174
+
175
+ def self.measure_mode_requires_gc_stats_enabled?
176
+ GC.respond_to?(:enable_stats) &&
177
+ [RubyProf::MEMORY, RubyProf::GC_TIME, RubyProf::GC_RUNS].include?(measure_mode)
178
+ end
179
+ end