Class: RubyProf::CallTreePrinter

Inherits:
AbstractPrinter show all
Defined in:
lib/ruby-prof/printers/call_tree_printer.rb

Overview

Generate profiling information in calltree format for use by kcachegrind and similar tools.

Instance Method Summary collapse

Methods inherited from AbstractPrinter

#initialize, #method_name, #min_percent, #print_file, #print_footer, #print_header, #setup_options, #sort_method

Constructor Details

This class inherits a constructor from RubyProf::AbstractPrinter

Instance Method Details

#convert(value) ⇒ Object



62
63
64
# File 'lib/ruby-prof/printers/call_tree_printer.rb', line 62

def convert(value)
  (value * @value_scale).round
end

#file(method) ⇒ Object



66
67
68
# File 'lib/ruby-prof/printers/call_tree_printer.rb', line 66

def file(method)
  File.expand_path(method.source_file)
end

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.

:print_file  - True or false. Specifies if a method's source
               file should be printed.  Default value if false.


20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/ruby-prof/printers/call_tree_printer.rb', line 20

def print(output = STDOUT, options = {})
  @output = output
  setup_options(options)

  # add a header - this information is somewhat arbitrary
  @output << "events: "
  case RubyProf.measure_mode
    when RubyProf::PROCESS_TIME
      @value_scale = RubyProf::CLOCKS_PER_SEC;
      @output << 'process_time'
    when RubyProf::WALL_TIME
      @value_scale = 1_000_000
      @output << 'wall_time'
    when RubyProf.const_defined?(:CPU_TIME) && RubyProf::CPU_TIME
      @value_scale = RubyProf.cpu_frequency
      @output << 'cpu_time'
    when RubyProf.const_defined?(:ALLOCATIONS) && RubyProf::ALLOCATIONS
      @value_scale = 1
      @output << 'allocations'
    when RubyProf.const_defined?(:MEMORY) && RubyProf::MEMORY
      @value_scale = 1
      @output << 'memory'
    when RubyProf.const_defined?(:GC_RUNS) && RubyProf::GC_RUNS
      @value_scale = 1
      @output << 'gc_runs'
    when RubyProf.const_defined?(:GC_TIME) && RubyProf::GC_TIME
      @value_scale = 1000000
      @output << 'gc_time'
    else
      raise "Unknown measure mode: #{RubyProf.measure_mode}"
  end
  @output << "\n\n"

  print_threads
end


70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/ruby-prof/printers/call_tree_printer.rb', line 70

def print_thread(thread)
  thread.methods.reverse_each do |method|
    # Print out the file and method name
    @output << "fl=#{file(method)}\n"
    @output << "fn=#{method_name(method)}\n"

    # Now print out the function line number and its self time
    @output << "#{method.line} #{convert(method.self_time)}\n"

    # Now print out all the children methods
    method.children.each do |callee|
      @output << "cfl=#{file(callee.target)}\n"
      @output << "cfn=#{method_name(callee.target)}\n"
      @output << "calls=#{callee.called} #{callee.line}\n"

      # Print out total times here!
      @output << "#{callee.line} #{convert(callee.total_time)}\n"
    end
  @output << "\n"
  end
end


56
57
58
59
60
# File 'lib/ruby-prof/printers/call_tree_printer.rb', line 56

def print_threads
  @result.threads.each do |thread|
    print_thread(thread)
  end
end