Permalink
Browse files

Update Merb profiler to output call tree

  • Loading branch information...
1 parent 2435f86 commit d5c1e89c82d0684874155a83e62698c58f55f80d @wycats wycats committed Dec 16, 2008
@@ -1,21 +1,55 @@
+begin
+ require "ruby-prof"
+rescue LoadError => e
+ Merb.fatal! "You need ruby-prof installed to use the profiler middleware", e
+end
+
module Merb
module Rack
class Profiler < Merb::Rack::Middleware
# :api: private
- def initialize(app, min=1, iter=1)
+ def initialize(app, types = [RubyProf::ALLOCATIONS, RubyProf::PROCESS_TIME])
super(app)
- @min, @iter = min, iter
+ @types = types
end
# :api: plugin
def call(env)
- __profile__("profile_output", @min, @iter) do
- @app.call(env)
+ measure_names = { RubyProf::ALLOCATIONS => 'allocations',
+ RubyProf::PROCESS_TIME => 'time', RubyProf::MEMORY => "memory" }
+
+ ret = nil
+
+ GC.disable
+ @types.each do |type|
+ next if type.nil?
+
+ if GC.respond_to?(:enable_stats)
+ GC.enable_stats || GC.clear_stats
+ end
+
+ RubyProf.measure_mode = type
+ RubyProf.start
+ 100.times do
+ ret = super
+ end
+ result = RubyProf.stop
+ printer = RubyProf::CallTreePrinter.new(result)
+ path = "merb_profile_results" / env["PATH_INFO"]
+ FileUtils.mkdir_p(path)
+ printer.print(
+ File.open(
+ "#{path}/callgrind.out.#{measure_names[RubyProf::measure_mode]}",
+ 'w'))
+
+ GC.disable_stats if GC.respond_to?(:disable_stats)
end
+ GC.enable
+ ret
end
end
end
-end
+end
@@ -19,4 +19,5 @@ src/*
gems/gems/*/
gems/specifications/*
!gems/gems/thor*/
-!gems/specifications/thor*
+!gems/specifications/thor*
+merb_profile_results

0 comments on commit d5c1e89

Please sign in to comment.