added support for profiling under rubinius

This commit is contained in:
Gonçalo Silva
2011-03-26 03:10:00 +00:00
parent 278344b3fa
commit 3872cc4a73
3 changed files with 66 additions and 7 deletions

View File

@@ -6,9 +6,10 @@ require 'action_view/helpers/number_helper'
module ActiveSupport
module Testing
module Performance
module Performance
# modified by each implementation
DEFAULTS =
if benchmark = ARGV.include?('--benchmark') # HAX for rake test
if ARGV.include?('--benchmark') # HAX for rake test
{ :benchmark => true,
:runs => 4,
:metrics => [:wall_time, :memory, :objects, :gc_runs, :gc_time],
@@ -17,10 +18,8 @@ module ActiveSupport
{ :benchmark => false,
:runs => 1,
:min_percent => 0.01,
:metrics => [:process_time, :memory, :objects],
:formats => [:flat, :graph_html, :call_tree],
:output => 'tmp/performance' }
end.freeze
end
def self.included(base)
base.superclass_delegating_accessor :profile_options

View File

@@ -3,16 +3,70 @@ require 'rubinius/agent'
module ActiveSupport
module Testing
module Performance
if !ARGV.include?('--benchmark')
DEFAULTS.merge!(
{ :metrics => [:wall_time],
:formats => [:flat, :graph] })
end
protected
def run_gc
GC.run(true)
end
class Performer; end
class Profiler < Performer
def initialize(*args)
super
end
def run
@profiler = Rubinius::Profiler::Instrumenter.new
@profiler.profile(false) do
profile_options[:runs].to_i.times { run_test(@metric, :profile) }
end
@total = @profiler.info[:runtime] / 1000 / 1000 / 1000.0 # seconds
end
def report
super
end
def record
if(profile_options[:formats].include?(:flat))
File.open(output_filename('FlatPrinter'), 'wb') do |file|
@profiler.show(file)
end
end
if(profile_options[:formats].include?(:graph))
@profiler.set_options({:graph => true})
File.open(output_filename('GraphPrinter'), 'wb') do |file|
@profiler.show(file)
end
end
end
protected
def output_filename(printer)
suffix =
case printer
when 'FlatPrinter'; 'flat.txt'
when 'GraphPrinter'; 'graph.txt'
else printer.sub(/Printer$/, '').underscore
end
"#{super()}_#{suffix}"
end
end
module Metrics
class Base
attr_reader :loopback
# TODO
def profile
yield
end

View File

@@ -8,6 +8,12 @@ end
module ActiveSupport
module Testing
module Performance
if !ARGV.include?('--benchmark')
DEFAULTS.merge!(
{ :metrics => [:process_time, :memory, :objects],
:formats => [:flat, :graph_html, :call_tree] })
end
protected
def run_gc
GC.start