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
|
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
|
||||||
|
|
Loading…
Reference in a new issue