Class: RubyProf::CallStackPrinter
Overview
Prints a HTML visualization of the call tree.
To use the printer:
result = RubyProf.profile do
[code to profile]
end
printer = RubyProf::CallStackPrinter.new(result)
printer.print(STDOUT)
Instance Method Summary
collapse
#filter_by, #initialize, #max_percent, #method_location, #min_percent, needs_dir?, #open_asset, #print_column_headers, #print_footer, #print_header, #print_thread, #print_threads, #sort_method, #time_format
Instance Method Details
#application ⇒ Object
148
149
150
|
# File 'lib/ruby-prof/printers/call_stack_printer.rb', line 148
def application
@options[:application] || $PROGRAM_NAME
end
|
#arguments ⇒ Object
152
153
154
|
# File 'lib/ruby-prof/printers/call_stack_printer.rb', line 152
def arguments
ARGV.join(' ')
end
|
#base64_image ⇒ Object
168
169
170
171
172
173
|
# File 'lib/ruby-prof/printers/call_stack_printer.rb', line 168
def base64_image
@data ||= begin
file = open_asset('call_stack_printer.png')
Base64.encode64(file).gsub(/\n/, '')
end
end
|
#color(p) ⇒ Object
135
136
137
138
139
140
141
142
143
144
145
146
|
# File 'lib/ruby-prof/printers/call_stack_printer.rb', line 135
def color(p)
case i = p.to_i
when 0..5
"01"
when 5..10
"05"
when 100
"9"
else
"#{i/10}"
end
end
|
#dump(ci) ⇒ Object
131
132
133
|
# File 'lib/ruby-prof/printers/call_stack_printer.rb', line 131
def dump(ci)
$stderr.printf "%s/%d t:%f s:%f w:%f \n", ci, ci.object_id, ci.total_time, ci.self_time, ci.wait_time
end
|
#expansion ⇒ Object
164
165
166
|
# File 'lib/ruby-prof/printers/call_stack_printer.rb', line 164
def expansion
@options[:expansion] || 10.0
end
|
#graph_link(call_tree) ⇒ Object
113
114
115
116
117
|
# File 'lib/ruby-prof/printers/call_stack_printer.rb', line 113
def graph_link(call_tree)
total_calls = call_tree.target.called
totals = total_calls.to_s
"[#{call_tree.called} calls, #{totals} total]"
end
|
#link(method, recursive) ⇒ Object
103
104
105
106
107
108
109
110
111
|
# File 'lib/ruby-prof/printers/call_stack_printer.rb', line 103
def link(method, recursive)
method_name = "#{recursive ? '*' : ''}#{method.full_name}"
if method.source_file.nil?
h method_name
else
file = File.expand_path(method.source_file)
"<a href=\"file://#{file}##{method.line}\">#{h method_name}</a>"
end
end
|
#method_href(method) ⇒ Object
119
120
121
|
# File 'lib/ruby-prof/printers/call_stack_printer.rb', line 119
def method_href(method)
h(method.full_name.gsub(/[><#\.\?=:]/,"_"))
end
|
#name(call_tree) ⇒ Object
98
99
100
101
|
# File 'lib/ruby-prof/printers/call_stack_printer.rb', line 98
def name(call_tree)
method = call_tree.target
method.full_name
end
|
#print(output = STDOUT, options = {}) ⇒ Object
Specify print options.
options - Hash table
:min_percent - Number 0 to 100 that specifes the minimum
%self (the methods self time divided by the
overall total time) that a method must take
for it to be printed out in the report.
Default value is 0.
:threshold - a float from 0 to 100 that sets the threshold of
results displayed.
Default value is 1.0
:title - a String to overide the default "ruby-prof call tree"
title of the report.
:expansion - a float from 0 to 100 that sets the threshold of
results that are expanded, if the percent_total
exceeds it.
Default value is 10.0
:application - a String to overide the name of the application,
as it appears on the report.
46
47
48
49
|
# File 'lib/ruby-prof/printers/call_stack_printer.rb', line 46
def print(output = STDOUT, options = {})
setup_options(options)
output << @erb.result(binding)
end
|
#print_stack(output, visited, call_tree, parent_time) ⇒ Object
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
# File 'lib/ruby-prof/printers/call_stack_printer.rb', line 57
def print_stack(output, visited, call_tree, parent_time)
total_time = call_tree.total_time
percent_parent = (total_time/parent_time)*100
percent_total = (total_time/@overall_time)*100
return unless percent_total > min_percent
color = self.color(percent_total)
visible = percent_total >= threshold
expanded = percent_total >= expansion
display = visible ? "block" : "none"
output << "<li class=\"color#{color}\" style=\"display:#{display}\">" << "\n"
if visited.include?(call_tree)
output << "<a href=\"#\" class=\"toggle empty\" ></a>" << "\n"
output << "<span>%s %s</span>" % [link(call_tree.target, true), graph_link(call_tree)] << "\n"
else
visited << call_tree
if call_tree.children.empty?
output << "<a href=\"#\" class=\"toggle empty\" ></a>" << "\n"
else
visible_children = call_tree.children.any?{|ci| (ci.total_time/@overall_time)*100 >= threshold}
image = visible_children ? (expanded ? "minus" : "plus") : "empty"
output << "<a href=\"#\" class=\"toggle #{image}\" ></a>" << "\n"
end
output << "<span>%4.2f%% (%4.2f%%) %s %s</span>" % [percent_total, percent_parent,
link(call_tree.target, false), graph_link(call_tree)] << "\n"
unless call_tree.children.empty?
output << (expanded ? '<ul>' : '<ul style="display:none">') << "\n"
call_tree.children.sort_by{|c| -c.total_time}.each do |child_call_tree|
print_stack(output, visited, child_call_tree, total_time)
end
output << '</ul>' << "\n"
end
visited.delete(call_tree)
end
output << '</li>' << "\n"
end
|
#setup_options(options) ⇒ Object
52
53
54
55
|
# File 'lib/ruby-prof/printers/call_stack_printer.rb', line 52
def setup_options(options)
super(options)
@erb = ERB.new(self.template)
end
|
#sum(a) ⇒ Object
127
128
129
|
# File 'lib/ruby-prof/printers/call_stack_printer.rb', line 127
def sum(a)
a.inject(0.0){|s,t| s+=t}
end
|
#template ⇒ Object
175
176
177
|
# File 'lib/ruby-prof/printers/call_stack_printer.rb', line 175
def template
open_asset('call_stack_printer.html.erb')
end
|
#threshold ⇒ Object
160
161
162
|
# File 'lib/ruby-prof/printers/call_stack_printer.rb', line 160
def threshold
@options[:threshold] || 1.0
end
|
#title ⇒ Object
156
157
158
|
# File 'lib/ruby-prof/printers/call_stack_printer.rb', line 156
def title
@title ||= @options.delete(:title) || "ruby-prof call tree"
end
|
#total_time(call_trees) ⇒ Object
123
124
125
|
# File 'lib/ruby-prof/printers/call_stack_printer.rb', line 123
def total_time(call_trees)
sum(call_trees.map{|ci| ci.total_time})
end
|