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:
parent
2541f7ac47
commit
1e0d2e36cc
1 changed files with 48 additions and 10 deletions
|
@ -12,13 +12,13 @@ module ActiveSupport
|
|||
if benchmark = ARGV.include?('--benchmark') # HAX for rake test
|
||||
{ :benchmark => true,
|
||||
:runs => 10,
|
||||
:metrics => [:process_time, :memory, :objects],
|
||||
:metrics => [:process_time, :memory, :objects, :gc_runs, :gc_time],
|
||||
:output => 'tmp/performance' }
|
||||
else
|
||||
{ :benchmark => false,
|
||||
:runs => 1,
|
||||
:min_percent => 0.02,
|
||||
:metrics => [:wall_time, :memory, :objects],
|
||||
:metrics => [:process_time, :memory, :objects, :gc_runs, :gc_time],
|
||||
:formats => [:flat, :graph_html, :call_tree],
|
||||
:output => 'tmp/performance' }
|
||||
end
|
||||
|
@ -72,9 +72,13 @@ module ActiveSupport
|
|||
|
||||
protected
|
||||
def run_warmup
|
||||
5.times { GC.start }
|
||||
|
||||
time = Metrics::Time.new
|
||||
run_test(time, :benchmark)
|
||||
puts "%s (%s warmup)" % [full_test_name, time.format(time.total)]
|
||||
|
||||
5.times { GC.start }
|
||||
end
|
||||
|
||||
def run_profile(metric)
|
||||
|
@ -219,6 +223,10 @@ module ActiveSupport
|
|||
self.class::Mode
|
||||
end
|
||||
|
||||
def measure
|
||||
0
|
||||
end
|
||||
|
||||
def benchmark
|
||||
with_gc_stats do
|
||||
before = measure
|
||||
|
@ -319,12 +327,6 @@ module ActiveSupport
|
|||
def measure
|
||||
GC.malloc_allocated_size / 1024.0
|
||||
end
|
||||
|
||||
# Unavailable
|
||||
else
|
||||
def measure
|
||||
0
|
||||
end
|
||||
end
|
||||
|
||||
def format(measurement)
|
||||
|
@ -343,9 +345,27 @@ module ActiveSupport
|
|||
def measure
|
||||
ObjectSpace.allocated_objects
|
||||
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
|
||||
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
|
||||
|
||||
|
@ -353,6 +373,24 @@ module ActiveSupport
|
|||
measurement.to_i.to_s
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue