ruby-prof 1.7.1 → 2.0.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 +4 -4
- data/{CHANGES → CHANGELOG.md} +118 -176
- data/README.md +5 -5
- data/bin/ruby-prof +1 -4
- data/docs/advanced-usage.md +132 -0
- data/docs/alternatives.md +98 -0
- data/docs/architecture.md +122 -0
- data/docs/best-practices.md +27 -0
- data/docs/getting-started.md +130 -0
- data/docs/history.md +11 -0
- data/docs/index.md +45 -0
- data/docs/profiling-rails.md +64 -0
- data/docs/public/examples/example.rb +33 -0
- data/docs/public/examples/generate_reports.rb +92 -0
- data/docs/public/examples/reports/call_info.txt +27 -0
- data/docs/public/examples/reports/call_stack.html +835 -0
- data/docs/public/examples/reports/callgrind.out +150 -0
- data/docs/public/examples/reports/flame_graph.html +408 -0
- data/docs/public/examples/reports/flat.txt +45 -0
- data/docs/public/examples/reports/graph.dot +129 -0
- data/docs/public/examples/reports/graph.html +1319 -0
- data/docs/public/examples/reports/graph.txt +100 -0
- data/docs/public/examples/reports/graphviz_viewer.html +1 -0
- data/docs/public/images/call_stack.png +0 -0
- data/docs/public/images/class_diagram.png +0 -0
- data/docs/public/images/dot_printer.png +0 -0
- data/docs/public/images/flame_graph.png +0 -0
- data/docs/public/images/flat.png +0 -0
- data/docs/public/images/graph.png +0 -0
- data/docs/public/images/graph_html.png +0 -0
- data/docs/public/images/ruby-prof-logo.svg +1 -0
- data/docs/reports.md +150 -0
- data/docs/stylesheets/extra.css +80 -0
- data/ext/ruby_prof/extconf.rb +23 -22
- data/ext/ruby_prof/rp_allocation.c +0 -15
- data/ext/ruby_prof/rp_allocation.h +29 -33
- data/ext/ruby_prof/rp_call_tree.c +3 -0
- data/ext/ruby_prof/rp_call_tree.h +1 -4
- data/ext/ruby_prof/rp_call_trees.c +296 -296
- data/ext/ruby_prof/rp_call_trees.h +25 -28
- data/ext/ruby_prof/rp_measure_allocations.c +47 -47
- data/ext/ruby_prof/rp_measure_process_time.c +64 -66
- data/ext/ruby_prof/rp_measure_wall_time.c +52 -64
- data/ext/ruby_prof/rp_measurement.c +0 -5
- data/ext/ruby_prof/rp_measurement.h +49 -53
- data/ext/ruby_prof/rp_method.c +554 -551
- data/ext/ruby_prof/rp_method.h +1 -4
- data/ext/ruby_prof/rp_profile.c +1 -1
- data/ext/ruby_prof/rp_profile.h +1 -5
- data/ext/ruby_prof/rp_stack.c +212 -212
- data/ext/ruby_prof/rp_stack.h +50 -53
- data/ext/ruby_prof/rp_thread.h +1 -4
- data/ext/ruby_prof/ruby_prof.c +50 -50
- data/ext/ruby_prof/ruby_prof.h +4 -6
- data/ext/ruby_prof/vc/ruby_prof.vcxproj +7 -8
- data/lib/ruby-prof/assets/call_stack_printer.html.erb +746 -711
- data/lib/ruby-prof/assets/flame_graph_printer.html.erb +412 -0
- data/lib/ruby-prof/assets/graph_printer.html.erb +355 -355
- data/lib/ruby-prof/call_tree.rb +57 -57
- data/lib/ruby-prof/call_tree_visitor.rb +36 -36
- data/lib/ruby-prof/exclude_common_methods.rb +204 -204
- data/lib/ruby-prof/measurement.rb +17 -17
- data/lib/ruby-prof/printers/abstract_printer.rb +142 -138
- data/lib/ruby-prof/printers/call_info_printer.rb +53 -53
- data/lib/ruby-prof/printers/call_stack_printer.rb +168 -180
- data/lib/ruby-prof/printers/call_tree_printer.rb +132 -145
- data/lib/ruby-prof/printers/dot_printer.rb +177 -132
- data/lib/ruby-prof/printers/flame_graph_printer.rb +79 -0
- data/lib/ruby-prof/printers/flat_printer.rb +52 -52
- data/lib/ruby-prof/printers/graph_html_printer.rb +62 -63
- data/lib/ruby-prof/printers/graph_printer.rb +112 -113
- data/lib/ruby-prof/printers/multi_printer.rb +134 -127
- data/lib/ruby-prof/profile.rb +13 -0
- data/lib/ruby-prof/rack.rb +114 -105
- data/lib/ruby-prof/task.rb +147 -147
- data/lib/ruby-prof/thread.rb +20 -20
- data/lib/ruby-prof/version.rb +3 -3
- data/lib/ruby-prof.rb +50 -52
- data/lib/unprof.rb +10 -10
- data/ruby-prof.gemspec +66 -65
- data/test/abstract_printer_test.rb +25 -27
- data/test/alias_test.rb +203 -117
- data/test/call_tree_builder.rb +126 -126
- data/test/call_tree_visitor_test.rb +27 -27
- data/test/call_trees_test.rb +66 -66
- data/test/duplicate_names_test.rb +32 -32
- data/test/dynamic_method_test.rb +50 -62
- data/test/enumerable_test.rb +23 -21
- data/test/exceptions_test.rb +24 -24
- data/test/exclude_methods_test.rb +363 -257
- data/test/exclude_threads_test.rb +48 -48
- data/test/fiber_test.rb +195 -195
- data/test/gc_test.rb +104 -102
- data/test/inverse_call_tree_test.rb +174 -174
- data/test/line_number_test.rb +563 -289
- data/test/marshal_test.rb +144 -145
- data/test/measure_allocations.rb +26 -26
- data/test/measure_allocations_test.rb +1511 -1081
- data/test/measure_process_time_test.rb +3286 -2477
- data/test/measure_times.rb +56 -56
- data/test/measure_wall_time_test.rb +773 -568
- data/test/measurement_test.rb +82 -82
- data/test/merge_test.rb +146 -146
- data/test/method_info_test.rb +100 -95
- data/test/multi_printer_test.rb +52 -66
- data/test/no_method_class_test.rb +15 -15
- data/test/pause_resume_test.rb +171 -171
- data/test/prime.rb +54 -54
- data/test/prime_script.rb +5 -5
- data/test/printer_call_stack_test.rb +28 -27
- data/test/printer_call_tree_test.rb +30 -30
- data/test/printer_flame_graph_test.rb +82 -0
- data/test/printer_flat_test.rb +99 -99
- data/test/printer_graph_html_test.rb +62 -59
- data/test/printer_graph_test.rb +42 -40
- data/test/printers_test.rb +162 -135
- data/test/printing_recursive_graph_test.rb +81 -81
- data/test/profile_test.rb +101 -101
- data/test/rack_test.rb +103 -93
- data/test/recursive_test.rb +796 -622
- data/test/scheduler.rb +4 -0
- data/test/singleton_test.rb +39 -38
- data/test/stack_printer_test.rb +61 -61
- data/test/start_stop_test.rb +106 -106
- data/test/test_helper.rb +24 -20
- data/test/thread_test.rb +229 -231
- data/test/unique_call_path_test.rb +123 -136
- data/test/yarv_test.rb +56 -60
- metadata +68 -16
- data/ext/ruby_prof/rp_measure_memory.c +0 -46
- data/lib/ruby-prof/compatibility.rb +0 -113
- data/test/compatibility_test.rb +0 -49
- data/test/crash2.rb +0 -144
- data/test/measure_memory_test.rb +0 -1456
data/lib/ruby-prof/call_tree.rb
CHANGED
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
module RubyProf
|
|
4
|
-
# The CallTree class is used to track the relationships between methods. It is a helper class used by
|
|
5
|
-
# RubyProf::MethodInfo to keep track of which methods called a given method and which methods a given
|
|
6
|
-
# method called. Each CallTree has a parent and target method. You cannot create a CallTree object directly,
|
|
7
|
-
# they are generated while running a profile.
|
|
8
|
-
class CallTree
|
|
9
|
-
# The number of times the parent method called the target method
|
|
10
|
-
def called
|
|
11
|
-
self.measurement.called
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
# The total time resulting from the parent method calling the target method
|
|
15
|
-
def total_time
|
|
16
|
-
self.measurement.total_time
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
# The self time (of the parent) resulting from the parent method calling the target method
|
|
20
|
-
def self_time
|
|
21
|
-
self.measurement.self_time
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# The wait time (of the parent) resulting from the parent method calling the target method
|
|
25
|
-
def wait_time
|
|
26
|
-
self.measurement.wait_time
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# The time spent in child methods resulting from the parent method calling the target method
|
|
30
|
-
def children_time
|
|
31
|
-
self.total_time - self.self_time - self.wait_time
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# Compares two CallTree instances. The comparison is based on the CallTree#parent, CallTree#target,
|
|
35
|
-
# and total time.
|
|
36
|
-
def <=>(other)
|
|
37
|
-
if self.target == other.target && self.parent == other.parent
|
|
38
|
-
0
|
|
39
|
-
elsif self.total_time < other.total_time
|
|
40
|
-
-1
|
|
41
|
-
elsif self.total_time > other.total_time
|
|
42
|
-
1
|
|
43
|
-
else
|
|
44
|
-
self.target.full_name <=> other.target.full_name
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# :nodoc:
|
|
49
|
-
def to_s
|
|
50
|
-
"<#{self.class.name} - #{self.target.full_name}>"
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def inspect
|
|
54
|
-
self.to_s
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
end
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module RubyProf
|
|
4
|
+
# The CallTree class is used to track the relationships between methods. It is a helper class used by
|
|
5
|
+
# RubyProf::MethodInfo to keep track of which methods called a given method and which methods a given
|
|
6
|
+
# method called. Each CallTree has a parent and target method. You cannot create a CallTree object directly,
|
|
7
|
+
# they are generated while running a profile.
|
|
8
|
+
class CallTree
|
|
9
|
+
# The number of times the parent method called the target method
|
|
10
|
+
def called
|
|
11
|
+
self.measurement.called
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# The total time resulting from the parent method calling the target method
|
|
15
|
+
def total_time
|
|
16
|
+
self.measurement.total_time
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# The self time (of the parent) resulting from the parent method calling the target method
|
|
20
|
+
def self_time
|
|
21
|
+
self.measurement.self_time
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# The wait time (of the parent) resulting from the parent method calling the target method
|
|
25
|
+
def wait_time
|
|
26
|
+
self.measurement.wait_time
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# The time spent in child methods resulting from the parent method calling the target method
|
|
30
|
+
def children_time
|
|
31
|
+
self.total_time - self.self_time - self.wait_time
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Compares two CallTree instances. The comparison is based on the CallTree#parent, CallTree#target,
|
|
35
|
+
# and total time.
|
|
36
|
+
def <=>(other)
|
|
37
|
+
if self.target == other.target && self.parent == other.parent
|
|
38
|
+
0
|
|
39
|
+
elsif self.total_time < other.total_time
|
|
40
|
+
-1
|
|
41
|
+
elsif self.total_time > other.total_time
|
|
42
|
+
1
|
|
43
|
+
else
|
|
44
|
+
self.target.full_name <=> other.target.full_name
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# :nodoc:
|
|
49
|
+
def to_s
|
|
50
|
+
"<#{self.class.name} - #{self.target.full_name}>"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def inspect
|
|
54
|
+
self.to_s
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
module RubyProf
|
|
2
|
-
# The call info visitor class does a depth-first traversal across a
|
|
3
|
-
# list of call infos. At each call_tree node, the visitor executes
|
|
4
|
-
# the block provided in the #visit method. The block is passed two
|
|
5
|
-
# parameters, the event and the call_tree instance. Event will be
|
|
6
|
-
# either :enter or :exit.
|
|
7
|
-
#
|
|
8
|
-
# visitor = RubyProf::CallTreeVisitor.new(result.threads.first.call_tree)
|
|
9
|
-
#
|
|
10
|
-
# method_names = Array.new
|
|
11
|
-
#
|
|
12
|
-
# visitor.visit do |call_tree, event|
|
|
13
|
-
# method_names << call_tree.target.full_name if event == :enter
|
|
14
|
-
# end
|
|
15
|
-
#
|
|
16
|
-
# puts method_names
|
|
17
|
-
class CallTreeVisitor
|
|
18
|
-
def initialize(call_tree)
|
|
19
|
-
@call_tree = call_tree
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def visit(&block)
|
|
23
|
-
visit_call_tree(@call_tree, &block)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
private
|
|
27
|
-
|
|
28
|
-
def visit_call_tree(call_tree, &block)
|
|
29
|
-
yield call_tree, :enter
|
|
30
|
-
call_tree.children.each do |child|
|
|
31
|
-
visit_call_tree(child, &block)
|
|
32
|
-
end
|
|
33
|
-
yield call_tree, :exit
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
1
|
+
module RubyProf
|
|
2
|
+
# The call info visitor class does a depth-first traversal across a
|
|
3
|
+
# list of call infos. At each call_tree node, the visitor executes
|
|
4
|
+
# the block provided in the #visit method. The block is passed two
|
|
5
|
+
# parameters, the event and the call_tree instance. Event will be
|
|
6
|
+
# either :enter or :exit.
|
|
7
|
+
#
|
|
8
|
+
# visitor = RubyProf::CallTreeVisitor.new(result.threads.first.call_tree)
|
|
9
|
+
#
|
|
10
|
+
# method_names = Array.new
|
|
11
|
+
#
|
|
12
|
+
# visitor.visit do |call_tree, event|
|
|
13
|
+
# method_names << call_tree.target.full_name if event == :enter
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
# puts method_names
|
|
17
|
+
class CallTreeVisitor
|
|
18
|
+
def initialize(call_tree)
|
|
19
|
+
@call_tree = call_tree
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def visit(&block)
|
|
23
|
+
visit_call_tree(@call_tree, &block)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def visit_call_tree(call_tree, &block)
|
|
29
|
+
yield call_tree, :enter
|
|
30
|
+
call_tree.children.each do |child|
|
|
31
|
+
visit_call_tree(child, &block)
|
|
32
|
+
end
|
|
33
|
+
yield call_tree, :exit
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -1,204 +1,204 @@
|
|
|
1
|
-
require 'set'
|
|
2
|
-
|
|
3
|
-
# :enddoc:
|
|
4
|
-
module RubyProf
|
|
5
|
-
module ExcludeCommonMethods
|
|
6
|
-
ENUMERABLE_NAMES = Enumerable.instance_methods(false)
|
|
7
|
-
|
|
8
|
-
def self.apply!(profile)
|
|
9
|
-
##
|
|
10
|
-
# Kernel Methods
|
|
11
|
-
##
|
|
12
|
-
|
|
13
|
-
exclude_methods(profile, Kernel, [
|
|
14
|
-
:dup,
|
|
15
|
-
:initialize_dup,
|
|
16
|
-
:tap,
|
|
17
|
-
:send,
|
|
18
|
-
:public_send,
|
|
19
|
-
])
|
|
20
|
-
|
|
21
|
-
##
|
|
22
|
-
# Fundamental Types
|
|
23
|
-
##
|
|
24
|
-
|
|
25
|
-
exclude_methods(profile, BasicObject, :!=)
|
|
26
|
-
exclude_methods(profile, Kernel, :"block_given?")
|
|
27
|
-
exclude_methods(profile, Method, :[])
|
|
28
|
-
exclude_methods(profile, Module, :new)
|
|
29
|
-
exclude_methods(profile, Class, :new)
|
|
30
|
-
exclude_methods(profile, Proc, :call, :yield)
|
|
31
|
-
exclude_methods(profile, Range, :each)
|
|
32
|
-
|
|
33
|
-
##
|
|
34
|
-
# Value Types
|
|
35
|
-
##
|
|
36
|
-
|
|
37
|
-
exclude_methods(profile, Integer, [
|
|
38
|
-
:times,
|
|
39
|
-
:succ,
|
|
40
|
-
:<
|
|
41
|
-
])
|
|
42
|
-
|
|
43
|
-
exclude_methods(profile, String, [
|
|
44
|
-
:sub,
|
|
45
|
-
:sub!,
|
|
46
|
-
:gsub,
|
|
47
|
-
:gsub!,
|
|
48
|
-
])
|
|
49
|
-
|
|
50
|
-
##
|
|
51
|
-
# Emumerables
|
|
52
|
-
##
|
|
53
|
-
|
|
54
|
-
exclude_enumerable(profile, Enumerable)
|
|
55
|
-
exclude_enumerable(profile, Enumerator)
|
|
56
|
-
|
|
57
|
-
##
|
|
58
|
-
# Collections
|
|
59
|
-
##
|
|
60
|
-
|
|
61
|
-
exclude_enumerable(profile, Array, [
|
|
62
|
-
:each_index,
|
|
63
|
-
:map!,
|
|
64
|
-
:select!,
|
|
65
|
-
:reject!,
|
|
66
|
-
:collect!,
|
|
67
|
-
:sort!,
|
|
68
|
-
:sort_by!,
|
|
69
|
-
:index,
|
|
70
|
-
:delete_if,
|
|
71
|
-
:keep_if,
|
|
72
|
-
:drop_while,
|
|
73
|
-
:uniq,
|
|
74
|
-
:uniq!,
|
|
75
|
-
:"==",
|
|
76
|
-
:eql?,
|
|
77
|
-
:hash,
|
|
78
|
-
:to_json,
|
|
79
|
-
:as_json,
|
|
80
|
-
:encode_json,
|
|
81
|
-
])
|
|
82
|
-
|
|
83
|
-
exclude_enumerable(profile, Hash, [
|
|
84
|
-
:dup,
|
|
85
|
-
:initialize_dup,
|
|
86
|
-
:fetch,
|
|
87
|
-
:"[]",
|
|
88
|
-
:"[]=",
|
|
89
|
-
:each_key,
|
|
90
|
-
:each_value,
|
|
91
|
-
:each_pair,
|
|
92
|
-
:map!,
|
|
93
|
-
:select!,
|
|
94
|
-
:reject!,
|
|
95
|
-
:collect!,
|
|
96
|
-
:delete_if,
|
|
97
|
-
:keep_if,
|
|
98
|
-
:slice,
|
|
99
|
-
:slice!,
|
|
100
|
-
:except,
|
|
101
|
-
:except!,
|
|
102
|
-
:"==",
|
|
103
|
-
:eql?,
|
|
104
|
-
:hash,
|
|
105
|
-
:to_json,
|
|
106
|
-
:as_json,
|
|
107
|
-
:encode_json,
|
|
108
|
-
])
|
|
109
|
-
|
|
110
|
-
exclude_enumerable(profile, Set, [
|
|
111
|
-
:map!,
|
|
112
|
-
:select!,
|
|
113
|
-
:reject!,
|
|
114
|
-
:collect!,
|
|
115
|
-
:classify,
|
|
116
|
-
:delete_if,
|
|
117
|
-
:keep_if,
|
|
118
|
-
:divide,
|
|
119
|
-
:"==",
|
|
120
|
-
:eql?,
|
|
121
|
-
:hash,
|
|
122
|
-
:to_json,
|
|
123
|
-
:as_json,
|
|
124
|
-
:encode_json,
|
|
125
|
-
])
|
|
126
|
-
|
|
127
|
-
##
|
|
128
|
-
# Garbage Collection
|
|
129
|
-
##
|
|
130
|
-
|
|
131
|
-
exclude_singleton_methods(profile, GC, [
|
|
132
|
-
:start
|
|
133
|
-
])
|
|
134
|
-
|
|
135
|
-
##
|
|
136
|
-
# Unicorn
|
|
137
|
-
##
|
|
138
|
-
|
|
139
|
-
if defined?(Unicorn)
|
|
140
|
-
exclude_methods(profile, Unicorn::HttpServer, :process_client)
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
if defined?(Unicorn::OobGC)
|
|
144
|
-
exclude_methods(profile, Unicorn::OobGC, :process_client)
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
##
|
|
148
|
-
# New Relic
|
|
149
|
-
##
|
|
150
|
-
|
|
151
|
-
if defined?(NewRelic::Agent)
|
|
152
|
-
if defined?(NewRelic::Agent::Instrumentation::MiddlewareTracing)
|
|
153
|
-
exclude_methods(profile, NewRelic::Agent::Instrumentation::MiddlewareTracing, [
|
|
154
|
-
:call
|
|
155
|
-
])
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
if defined?(NewRelic::Agent::MethodTracerHelpers)
|
|
159
|
-
exclude_methods(profile, NewRelic::Agent::MethodTracerHelpers, [
|
|
160
|
-
:trace_execution_scoped,
|
|
161
|
-
:log_errors,
|
|
162
|
-
])
|
|
163
|
-
|
|
164
|
-
exclude_singleton_methods(profile, NewRelic::Agent::MethodTracerHelpers, [
|
|
165
|
-
:trace_execution_scoped,
|
|
166
|
-
:log_errors,
|
|
167
|
-
])
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
if defined?(NewRelic::Agent::MethodTracer)
|
|
171
|
-
exclude_methods(profile, NewRelic::Agent::MethodTracer, [
|
|
172
|
-
:trace_execution_scoped,
|
|
173
|
-
:trace_execution_unscoped,
|
|
174
|
-
])
|
|
175
|
-
end
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
##
|
|
179
|
-
# Miscellaneous Methods
|
|
180
|
-
##
|
|
181
|
-
|
|
182
|
-
if defined?(Mustache)
|
|
183
|
-
exclude_methods(profile, Mustache::Context, [
|
|
184
|
-
:fetch
|
|
185
|
-
])
|
|
186
|
-
end
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
private
|
|
190
|
-
|
|
191
|
-
def self.exclude_enumerable(profile, mod, *method_or_methods)
|
|
192
|
-
exclude_methods(profile, mod, [:each, *method_or_methods])
|
|
193
|
-
exclude_methods(profile, mod, ENUMERABLE_NAMES)
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
def self.exclude_methods(profile, mod, *method_or_methods)
|
|
197
|
-
profile.exclude_methods!(mod, method_or_methods)
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
def self.exclude_singleton_methods(profile, mod, *method_or_methods)
|
|
201
|
-
profile.exclude_singleton_methods!(mod, method_or_methods)
|
|
202
|
-
end
|
|
203
|
-
end
|
|
204
|
-
end
|
|
1
|
+
require 'set'
|
|
2
|
+
|
|
3
|
+
# :enddoc:
|
|
4
|
+
module RubyProf
|
|
5
|
+
module ExcludeCommonMethods
|
|
6
|
+
ENUMERABLE_NAMES = Enumerable.instance_methods(false)
|
|
7
|
+
|
|
8
|
+
def self.apply!(profile)
|
|
9
|
+
##
|
|
10
|
+
# Kernel Methods
|
|
11
|
+
##
|
|
12
|
+
|
|
13
|
+
exclude_methods(profile, Kernel, [
|
|
14
|
+
:dup,
|
|
15
|
+
:initialize_dup,
|
|
16
|
+
:tap,
|
|
17
|
+
:send,
|
|
18
|
+
:public_send,
|
|
19
|
+
])
|
|
20
|
+
|
|
21
|
+
##
|
|
22
|
+
# Fundamental Types
|
|
23
|
+
##
|
|
24
|
+
|
|
25
|
+
exclude_methods(profile, BasicObject, :!=)
|
|
26
|
+
exclude_methods(profile, Kernel, :"block_given?")
|
|
27
|
+
exclude_methods(profile, Method, :[])
|
|
28
|
+
exclude_methods(profile, Module, :new)
|
|
29
|
+
exclude_methods(profile, Class, :new)
|
|
30
|
+
exclude_methods(profile, Proc, :call, :yield)
|
|
31
|
+
exclude_methods(profile, Range, :each)
|
|
32
|
+
|
|
33
|
+
##
|
|
34
|
+
# Value Types
|
|
35
|
+
##
|
|
36
|
+
|
|
37
|
+
exclude_methods(profile, Integer, [
|
|
38
|
+
:times,
|
|
39
|
+
:succ,
|
|
40
|
+
:<
|
|
41
|
+
])
|
|
42
|
+
|
|
43
|
+
exclude_methods(profile, String, [
|
|
44
|
+
:sub,
|
|
45
|
+
:sub!,
|
|
46
|
+
:gsub,
|
|
47
|
+
:gsub!,
|
|
48
|
+
])
|
|
49
|
+
|
|
50
|
+
##
|
|
51
|
+
# Emumerables
|
|
52
|
+
##
|
|
53
|
+
|
|
54
|
+
exclude_enumerable(profile, Enumerable)
|
|
55
|
+
exclude_enumerable(profile, Enumerator)
|
|
56
|
+
|
|
57
|
+
##
|
|
58
|
+
# Collections
|
|
59
|
+
##
|
|
60
|
+
|
|
61
|
+
exclude_enumerable(profile, Array, [
|
|
62
|
+
:each_index,
|
|
63
|
+
:map!,
|
|
64
|
+
:select!,
|
|
65
|
+
:reject!,
|
|
66
|
+
:collect!,
|
|
67
|
+
:sort!,
|
|
68
|
+
:sort_by!,
|
|
69
|
+
:index,
|
|
70
|
+
:delete_if,
|
|
71
|
+
:keep_if,
|
|
72
|
+
:drop_while,
|
|
73
|
+
:uniq,
|
|
74
|
+
:uniq!,
|
|
75
|
+
:"==",
|
|
76
|
+
:eql?,
|
|
77
|
+
:hash,
|
|
78
|
+
:to_json,
|
|
79
|
+
:as_json,
|
|
80
|
+
:encode_json,
|
|
81
|
+
])
|
|
82
|
+
|
|
83
|
+
exclude_enumerable(profile, Hash, [
|
|
84
|
+
:dup,
|
|
85
|
+
:initialize_dup,
|
|
86
|
+
:fetch,
|
|
87
|
+
:"[]",
|
|
88
|
+
:"[]=",
|
|
89
|
+
:each_key,
|
|
90
|
+
:each_value,
|
|
91
|
+
:each_pair,
|
|
92
|
+
:map!,
|
|
93
|
+
:select!,
|
|
94
|
+
:reject!,
|
|
95
|
+
:collect!,
|
|
96
|
+
:delete_if,
|
|
97
|
+
:keep_if,
|
|
98
|
+
:slice,
|
|
99
|
+
:slice!,
|
|
100
|
+
:except,
|
|
101
|
+
:except!,
|
|
102
|
+
:"==",
|
|
103
|
+
:eql?,
|
|
104
|
+
:hash,
|
|
105
|
+
:to_json,
|
|
106
|
+
:as_json,
|
|
107
|
+
:encode_json,
|
|
108
|
+
])
|
|
109
|
+
|
|
110
|
+
exclude_enumerable(profile, Set, [
|
|
111
|
+
:map!,
|
|
112
|
+
:select!,
|
|
113
|
+
:reject!,
|
|
114
|
+
:collect!,
|
|
115
|
+
:classify,
|
|
116
|
+
:delete_if,
|
|
117
|
+
:keep_if,
|
|
118
|
+
:divide,
|
|
119
|
+
:"==",
|
|
120
|
+
:eql?,
|
|
121
|
+
:hash,
|
|
122
|
+
:to_json,
|
|
123
|
+
:as_json,
|
|
124
|
+
:encode_json,
|
|
125
|
+
])
|
|
126
|
+
|
|
127
|
+
##
|
|
128
|
+
# Garbage Collection
|
|
129
|
+
##
|
|
130
|
+
|
|
131
|
+
exclude_singleton_methods(profile, GC, [
|
|
132
|
+
:start
|
|
133
|
+
])
|
|
134
|
+
|
|
135
|
+
##
|
|
136
|
+
# Unicorn
|
|
137
|
+
##
|
|
138
|
+
|
|
139
|
+
if defined?(Unicorn)
|
|
140
|
+
exclude_methods(profile, Unicorn::HttpServer, :process_client)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
if defined?(Unicorn::OobGC)
|
|
144
|
+
exclude_methods(profile, Unicorn::OobGC, :process_client)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
##
|
|
148
|
+
# New Relic
|
|
149
|
+
##
|
|
150
|
+
|
|
151
|
+
if defined?(NewRelic::Agent)
|
|
152
|
+
if defined?(NewRelic::Agent::Instrumentation::MiddlewareTracing)
|
|
153
|
+
exclude_methods(profile, NewRelic::Agent::Instrumentation::MiddlewareTracing, [
|
|
154
|
+
:call
|
|
155
|
+
])
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
if defined?(NewRelic::Agent::MethodTracerHelpers)
|
|
159
|
+
exclude_methods(profile, NewRelic::Agent::MethodTracerHelpers, [
|
|
160
|
+
:trace_execution_scoped,
|
|
161
|
+
:log_errors,
|
|
162
|
+
])
|
|
163
|
+
|
|
164
|
+
exclude_singleton_methods(profile, NewRelic::Agent::MethodTracerHelpers, [
|
|
165
|
+
:trace_execution_scoped,
|
|
166
|
+
:log_errors,
|
|
167
|
+
])
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
if defined?(NewRelic::Agent::MethodTracer)
|
|
171
|
+
exclude_methods(profile, NewRelic::Agent::MethodTracer, [
|
|
172
|
+
:trace_execution_scoped,
|
|
173
|
+
:trace_execution_unscoped,
|
|
174
|
+
])
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
##
|
|
179
|
+
# Miscellaneous Methods
|
|
180
|
+
##
|
|
181
|
+
|
|
182
|
+
if defined?(Mustache)
|
|
183
|
+
exclude_methods(profile, Mustache::Context, [
|
|
184
|
+
:fetch
|
|
185
|
+
])
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
private
|
|
190
|
+
|
|
191
|
+
def self.exclude_enumerable(profile, mod, *method_or_methods)
|
|
192
|
+
exclude_methods(profile, mod, [:each, *method_or_methods])
|
|
193
|
+
exclude_methods(profile, mod, ENUMERABLE_NAMES)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def self.exclude_methods(profile, mod, *method_or_methods)
|
|
197
|
+
profile.exclude_methods!(mod, method_or_methods)
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def self.exclude_singleton_methods(profile, mod, *method_or_methods)
|
|
201
|
+
profile.exclude_singleton_methods!(mod, method_or_methods)
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
end
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
module RubyProf
|
|
2
|
-
# The Measurement class is a helper class used by RubyProf::MethodInfo to store information about the method.
|
|
3
|
-
# You cannot create a CallTree object directly, they are generated while running a profile.
|
|
4
|
-
class Measurement
|
|
5
|
-
def children_time
|
|
6
|
-
self.total_time - self.self_time - self.wait_time
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def to_s
|
|
10
|
-
"c: #{called}, tt: #{total_time}, st: #{self_time}"
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def inspect
|
|
14
|
-
super + "(#{self.to_s})"
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
1
|
+
module RubyProf
|
|
2
|
+
# The Measurement class is a helper class used by RubyProf::MethodInfo to store information about the method.
|
|
3
|
+
# You cannot create a CallTree object directly, they are generated while running a profile.
|
|
4
|
+
class Measurement
|
|
5
|
+
def children_time
|
|
6
|
+
self.total_time - self.self_time - self.wait_time
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def to_s
|
|
10
|
+
"c: #{called}, tt: #{total_time}, st: #{self_time}"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def inspect
|
|
14
|
+
super + "(#{self.to_s})"
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|