1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Performance: add GC metrics for # of runs and total runtime

This commit is contained in:
Jeremy Kemper 2008-06-18 18:46:17 -07:00
parent 2541f7ac47
commit 1e0d2e36cc

View file

@ -12,13 +12,13 @@ module ActiveSupport
if benchmark = ARGV.include?('--benchmark') # HAX for rake test if benchmark = ARGV.include?('--benchmark') # HAX for rake test
{ :benchmark => true, { :benchmark => true,
:runs => 10, :runs => 10,
:metrics => [:process_time, :memory, :objects], :metrics => [:process_time, :memory, :objects, :gc_runs, :gc_time],
:output => 'tmp/performance' } :output => 'tmp/performance' }
else else
{ :benchmark => false, { :benchmark => false,
:runs => 1, :runs => 1,
:min_percent => 0.02, :min_percent => 0.02,
:metrics => [:wall_time, :memory, :objects], :metrics => [:process_time, :memory, :objects, :gc_runs, :gc_time],
:formats => [:flat, :graph_html, :call_tree], :formats => [:flat, :graph_html, :call_tree],
:output => 'tmp/performance' } :output => 'tmp/performance' }
end end
@ -72,9 +72,13 @@ module ActiveSupport
protected protected
def run_warmup def run_warmup
5.times { GC.start }
time = Metrics::Time.new time = Metrics::Time.new
run_test(time, :benchmark) run_test(time, :benchmark)
puts "%s (%s warmup)" % [full_test_name, time.format(time.total)] puts "%s (%s warmup)" % [full_test_name, time.format(time.total)]
5.times { GC.start }
end end
def run_profile(metric) def run_profile(metric)
@ -219,6 +223,10 @@ module ActiveSupport
self.class::Mode self.class::Mode
end end
def measure
0
end
def benchmark def benchmark
with_gc_stats do with_gc_stats do
before = measure before = measure
@ -319,12 +327,6 @@ module ActiveSupport
def measure def measure
GC.malloc_allocated_size / 1024.0 GC.malloc_allocated_size / 1024.0
end end
# Unavailable
else
def measure
0
end
end end
def format(measurement) def format(measurement)
@ -343,9 +345,27 @@ module ActiveSupport
def measure def measure
ObjectSpace.allocated_objects ObjectSpace.allocated_objects
end end
else end
def format(measurement)
measurement.to_i.to_s
end
end
class GcRuns < Base
Mode = RubyProf::GC_RUNS
if RubyProf.respond_to?(:measure_gc_runs)
def measure def measure
0 RubyProf.measure_gc_runs
end
elsif GC.respond_to?(:collections)
def measure
GC.collections
end
elsif GC.respond_to?(:heap_info)
def measure
GC.heap_info['num_gc_passes']
end end
end end
@ -353,6 +373,24 @@ module ActiveSupport
measurement.to_i.to_s measurement.to_i.to_s
end end
end end
class GcTime < Base
Mode = RubyProf::GC_TIME
if RubyProf.respond_to?(:measure_gc_time)
def measure
RubyProf.measure_gc_time
end
elsif GC.respond_to?(:time)
def measure
GC.time
end
end
def format(measurement)
'%d ms' % (measurement / 1000)
end
end
end end
end end
end end