module WTF::MethodTracker
Attributes
last_heap[RW]
last_time[RW]
stack[RW]
stats[RW]
Public Class Methods
add_stats(at_start = nil)
click to toggle source
# File lib/wtf/method_tracker.rb, line 63 def add_stats(at_start = nil) stat = stats[stack.last] this_time = AbsoluteTime.now stat[:time] += this_time - last_time self.last_time = this_time this_heap = GC.stat[:heap_length] stat[:heap] += this_heap - last_heap self.last_heap = this_heap stats[at_start][:freq] += 1 if at_start end
dump_stats()
click to toggle source
# File lib/wtf/method_tracker.rb, line 77 def dump_stats data = stats.map do |key, val| [*key, val[:freq].to_i, val[:time].to_f.round(3), (val[:heap].to_f / 64).round(3)] end data = data.sort_by {|it| it[3] }.reverse data.unshift(%w(class method count time heap_mb)) time = Time.now.strftime('%m%d_%H%M%S') file = File.join(WTF.files_path, "track_#{time}_#{rand(10000)}.csv") File.write(file, data.map(&:to_csv).join) end
finish()
click to toggle source
# File lib/wtf/method_tracker.rb, line 57 def finish add_stats dump_stats reset_state end
on_end()
click to toggle source
# File lib/wtf/method_tracker.rb, line 52 def on_end add_stats stack.pop end
on_start(*full_name)
click to toggle source
# File lib/wtf/method_tracker.rb, line 47 def on_start(*full_name) add_stats(full_name) stack.push(full_name) end
override_method(base, name)
click to toggle source
# File lib/wtf/method_tracker.rb, line 27 def override_method(base, name) %{ def #{name}(*args) WTF::MethodTracker.on_start(#{base}, :#{name}) return_value = super WTF::MethodTracker.on_end return_value end } end
prepare(base)
click to toggle source
# File lib/wtf/method_tracker.rb, line 14 def prepare(base) methods = base.instance_methods(false) + base.private_instance_methods(false) compiled = methods.map do |name| override_method(base, name) end base.module_eval %{ module Tracking #{compiled.join} end prepend Tracking } end
reset_state()
click to toggle source
# File lib/wtf/method_tracker.rb, line 40 def reset_state self.stats = Hash.new { |h,k| h[k] = { freq: 0, time: 0.0, heap: 0 } } self.stack = [[nil, :top]] self.last_time = AbsoluteTime.now self.last_heap = GC.stat[:heap_length] end
start_tracking(*objects)
click to toggle source
# File lib/wtf/method_tracker.rb, line 4 def start_tracking(*objects) require 'absolute_time' objects.each do |object| klass = object.is_a?(Module) ? object : object.class prepare(klass) end reset_state end