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
data/lib/ruby-prof/call_info.rb
CHANGED
@@ -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
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
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
|