Class: StackProf::Report

Inherits:
Object
  • Object
show all
Defined in:
lib/stackprof/report.rb

Instance Method Summary collapse

Constructor Details

#initialize(data) ⇒ Report

Returns a new instance of Report.



5
6
7
# File 'lib/stackprof/report.rb', line 5

def initialize(data)
  @data = data
end

Instance Method Details

#framesObject



9
10
11
# File 'lib/stackprof/report.rb', line 9

def frames
  @data[:frames].sort_by{ |iseq, stats| -stats[:samples] }
end

#overall_samplesObject



13
14
15
# File 'lib/stackprof/report.rb', line 13

def overall_samples
  @data[:samples]
end


17
18
19
# File 'lib/stackprof/report.rb', line 17

def print_debug
  pp @data
end


21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/stackprof/report.rb', line 21

def print_graphviz
  f = STDOUT
  f.puts "digraph profile {"
  frames.each do |frame, info|
    call, total = info.values_at(:samples, :total_samples)
    sample = ''
    sample << "#{call} (%2.1f%%)\\rof " % (call*100.0/overall_samples) if call < total
    sample << "#{total} (%2.1f%%)\\r" % (total*100.0/overall_samples)
    size = (1.0 * call / overall_samples) * 28 + 10

    f.puts "  #{frame} [size=#{size}] [fontsize=#{size}] [shape=box] [label=\"#{info[:name]}\\n#{sample}\"];"
    if edges = info[:edges]
      edges.each do |edge, weight|
        size = (1.0 * weight / overall_samples) * 28
        f.puts "  #{frame} -> #{edge} [label=\"#{weight}\"];"
      end
    end
  end
  f.puts "}"
end


50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/stackprof/report.rb', line 50

def print_source(name)
  name = /#{Regexp.escape name}/ unless Regexp === name
  frames.each do |frame, info|
    next unless info[:name] =~ name
    file, line = info.values_at(:file, :line)

    maxline = info[:lines] ? info[:lines].keys.max : line + 5
    printf "%s (%s:%d)\n", info[:name], file, line

    lines = info[:lines]
    source = File.readlines(file).each_with_index do |code, i|
      next unless (line-1..maxline).include?(i)
      if lines and samples = lines[i+1]
        printf "% 5d % 7s / % 7s  | % 5d  | %s", samples, "(%2.1f%%" % (100.0*samples/overall_samples), "%2.1f%%)" % (100.0*samples/info[:samples]), i+1, code
      else
        printf "                         | % 5d  | %s", i+1, code
      end
    end
  end
end


42
43
44
45
46
47
48
# File 'lib/stackprof/report.rb', line 42

def print_text
  printf "% 10s    (pct)  % 10s    (pct)     FRAME\n" % ["TOTAL", "SAMPLES"]
  frames.each do |frame, info|
    call, total = info.values_at(:samples, :total_samples)
    printf "% 10d % 8s  % 10d % 8s     %s\n", total, "(%2.1f%%)" % (total*100.0/overall_samples), call, "(%2.1f%%)" % (call*100.0/overall_samples), info[:name]
  end
end