Skip to content

Commit

Permalink
Update Merb profiler to output call tree
Browse files Browse the repository at this point in the history
  • Loading branch information
wycats committed Dec 16, 2008
1 parent 2435f86 commit d5c1e89
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 6 deletions.
44 changes: 39 additions & 5 deletions merb-core/lib/merb-core/rack/middleware/profiler.rb
@@ -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
Expand Up @@ -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.