lib/ruby-prof/graph_printer.rb in ruby-prof-0.8.2 vs lib/ruby-prof/graph_printer.rb in ruby-prof-0.9.0

- old
+ new

@@ -1,9 +1,9 @@ require 'ruby-prof/abstract_printer' module RubyProf - # Generates graph[link:files/examples/graph_txt.html] profile reports as text. + # Generates graph[link:files/examples/graph_txt.html] profile reports as text. # To use the graph printer: # # result = RubyProf.profile do # [code to profile] # end @@ -15,77 +15,77 @@ class GraphPrinter < AbstractPrinter PERCENTAGE_WIDTH = 8 TIME_WIDTH = 10 CALL_WIDTH = 17 - - # Create a GraphPrinter. Result is a RubyProf::Result + + # Create a GraphPrinter. Result is a RubyProf::Result # object generated from a profiling run. def initialize(result) super(result) @thread_times = Hash.new calculate_thread_times end def calculate_thread_times # Cache thread times since this is an expensive - # operation with the required sorting + # operation with the required sorting @result.threads.each do |thread_id, methods| top = methods.max - + thread_time = [top.total_time, 0.01].max - - @thread_times[thread_id] = thread_time + + @thread_times[thread_id] = thread_time end end - + # Print a graph report to the provided output. - # - # output - Any IO oject, including STDOUT or a file. + # + # output - Any IO oject, including STDOUT or a file. # The default value is STDOUT. - # - # options - Hash of print options. See #setup_options + # + # options - Hash of print options. See #setup_options # for more information. # def print(output = STDOUT, options = {}) @output = output setup_options(options) print_threads end - private + private def print_threads # sort assumes that spawned threads have higher object_ids @result.threads.sort.each do |thread_id, methods| print_methods(thread_id, methods) @output << "\n" * 2 end end - + def print_methods(thread_id, methods) # Sort methods from longest to shortest total time methods = methods.sort - + toplevel = methods.last total_time = toplevel.total_time if total_time == 0 total_time = 0.01 end - + print_heading(thread_id) - + # Print each method in total time order methods.reverse_each do |method| total_percentage = (method.total_time/total_time) * 100 self_percentage = (method.self_time/total_time) * 100 - + next if total_percentage < min_percent - + @output << "-" * 80 << "\n" print_parents(thread_id, method) - + # 1 is for % sign @output << sprintf("%#{PERCENTAGE_WIDTH-1}.2f\%", total_percentage) @output << sprintf("%#{PERCENTAGE_WIDTH-1}.2f\%", self_percentage) @output << sprintf("%#{TIME_WIDTH}.2f", method.total_time) @output << sprintf("%#{TIME_WIDTH}.2f", method.self_time) @@ -93,22 +93,22 @@ @output << sprintf("%#{TIME_WIDTH}.2f", method.children_time) @output << sprintf("%#{CALL_WIDTH}i", method.called) @output << sprintf(" %s", method_name(method)) if print_file @output << sprintf(" %s:%s", method.source_file, method.line) - end + end @output << "\n" - + print_children(method) end end - + def print_heading(thread_id) @output << "Thread ID: #{thread_id}\n" @output << "Total Time: #{@thread_times[thread_id]}\n" @output << "\n" - + # 1 is for % sign @output << sprintf("%#{PERCENTAGE_WIDTH}s", "%total") @output << sprintf("%#{PERCENTAGE_WIDTH}s", "%self") @output << sprintf("%#{TIME_WIDTH}s", "total") @output << sprintf("%#{TIME_WIDTH}s", "self") @@ -116,33 +116,33 @@ @output << sprintf("%#{TIME_WIDTH}s", "child") @output << sprintf("%#{CALL_WIDTH}s", "calls") @output << " Name" @output << "\n" end - + def print_parents(thread_id, method) method.aggregate_parents.sort_by(&:total_time).each do |caller| next unless caller.parent @output << " " * 2 * PERCENTAGE_WIDTH @output << sprintf("%#{TIME_WIDTH}.2f", caller.total_time) @output << sprintf("%#{TIME_WIDTH}.2f", caller.self_time) @output << sprintf("%#{TIME_WIDTH}.2f", caller.wait_time) @output << sprintf("%#{TIME_WIDTH}.2f", caller.children_time) - + call_called = "#{caller.called}/#{method.called}" @output << sprintf("%#{CALL_WIDTH}s", call_called) @output << sprintf(" %s", caller.parent.target.full_name) @output << "\n" end end - + def print_children(method) method.aggregate_children.sort_by(&:total_time).reverse.each do |child| # Get children method - + @output << " " * 2 * PERCENTAGE_WIDTH - + @output << sprintf("%#{TIME_WIDTH}.2f", child.total_time) @output << sprintf("%#{TIME_WIDTH}.2f", child.self_time) @output << sprintf("%#{TIME_WIDTH}.2f", child.wait_time) @output << sprintf("%#{TIME_WIDTH}.2f", child.children_time) @@ -151,7 +151,7 @@ @output << sprintf(" %s", child.target.full_name) @output << "\n" end end end -end +end