# benchmarker.rb # Ram Ravichandran # http://raam.splitbook.com # requires the facet gem (gem install facets) require 'facets/class_extension.rb' module Benchmarker if ENV['EXTRA_BENCHMARKING'] == "1" @@added_methods = [] $logger = Logger.new("#{RAILS_ROOT}/log/benchmark.log") unless $logger $padding = 1 unless $padding def benchmark_call_inc_foo $padding += 1 end def benchmark_call_dec_foo $padding -= 1 end def benchmark_call_pretty_padding_before "| "*$padding + "\n" + "| "*$padding end def benchmark_call_pretty_padding_after "| "*$padding end class_extension { def method_added(id) # wrap a benchmark around all controller method calls name = id.id2name if name =~ /^benchmark_call_(.*)$/ return if @@added_methods.include?($1) else return if @@added_methods.include?(name) end @@added_methods << name alias_method "benchmark_call_#{name}".intern, name.intern class_eval <<-CLASS_STRING def #{name}(*args, &block) g = send("benchmark_call_pretty_padding_before") + "#{self}::#{name}" $logger.error( g + " START") yreturn = nil send("benchmark_call_inc_foo") x = Benchmark.measure { yreturn = send("benchmark_call_#{name}", *args, &block)} send("benchmark_call_dec_foo") g = send("benchmark_call_pretty_padding_after") + "#{self}::#{name}" $logger.error(g + " STOP: " + x.to_s.strip) yreturn end CLASS_STRING end } end end