Module: Profiler__

Defined in:
lib/profiler.rb

Constant Summary collapse

PROFILE_PROC =
proc{|event, file, line, id, binding, klass|
  case event
  when "call", "c-call"
    now = Process.times[0]
    @@stack.push [now, 0.0]
  when "return", "c-return"
    now = Process.times[0]
    key = [klass, id]
    if tick = @@stack.pop
      data = (@@map[key] ||= [0, 0.0, 0.0, key])
      data[0] += 1
      cost = now - tick[0]
      data[1] += cost
      data[2] += cost - tick[1]
      @@stack[-1][1] += cost if @@stack[-1]
    end
  end
}
@@start =

internal values

@@stack = @@map = nil

Instance Method Summary collapse

Instance Method Details



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/profiler.rb', line 32

def print_profile(f)
  stop_profile
  total = Process.times[0] - @@start
  if total == 0 then total = 0.01 end
  data = @@map.values
  data.sort!{|a,b| b[2] <=> a[2]}
  sum = 0
  f.printf "  %%   cumulative   self              self     total\n"
  f.printf " time   seconds   seconds    calls  ms/call  ms/call  name\n"
  for d in data
    sum += d[2]
    f.printf "%6.2f %8.2f  %8.2f %8d ", d[2]/total*100, sum, d[2], d[0]
    f.printf "%8.2f %8.2f  %s\n", d[2]*1000/d[0], d[1]*1000/d[0], get_name(*d[3])
  end
  f.printf "%6.2f %8.2f  %8.2f %8d ", 0.0, total, 0.0, 1     # ???
  f.printf "%8.2f %8.2f  %s\n", 0.0, total*1000, "#toplevel" # ???
end

#start_profileObject



23
24
25
26
27
28
# File 'lib/profiler.rb', line 23

def start_profile
  @@start = Process.times[0]
  @@stack = []
  @@map = {}
  set_trace_func PROFILE_PROC
end

#stop_profileObject



29
30
31
# File 'lib/profiler.rb', line 29

def stop_profile
  set_trace_func nil
end