Skip to content
Browse files

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

  • Loading branch information...
1 parent 2541f7a commit 1e0d2e36cc4b524ca5a4330eeb3e3fd7f5ca0b5e @jeremy jeremy committed Jun 18, 2008
Showing with 48 additions and 10 deletions.
  1. +48 −10 activesupport/lib/active_support/testing/performance.rb
View
58 activesupport/lib/active_support/testing/performance.rb
@@ -12,13 +12,13 @@ module Performance
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 @@ def run_test(metric, mode)
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 @@ def measure_mode
self.class::Mode
end
+ def measure
+ 0
+ end
+
def benchmark
with_gc_stats do
before = measure
@@ -319,12 +327,6 @@ def measure
def measure
GC.malloc_allocated_size / 1024.0
end
-
- # Unavailable
- else
- def measure
- 0
- end
end
def format(measurement)
@@ -343,16 +345,52 @@ def measure
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
+ RubyProf.measure_gc_runs
+ end
+ elsif GC.respond_to?(:collections)
def measure
- 0
+ GC.collections
+ end
+ elsif GC.respond_to?(:heap_info)
+ def measure
+ GC.heap_info['num_gc_passes']
end
end
def format(measurement)
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

4 comments on commit 1e0d2e3

@chuyeow

I’m getting a const_missing for RubyProf::GC_RUNS and RubyProf::GC_TIME with vanilla ruby-prof (from your fork, Jeremy) – I’m probably missing a patch of some sort.

Anyway, the Mode assignments to these constants probably should be done conditionally.

@jeremy
Ruby on Rails member
jeremy commented on 1e0d2e3 Jun 20, 2008

Oops, good point :) Fixed in fd27488

@chuyeow

Thanks! This is great stuff you’re doing btw (this and the perf improvements). :)

@theflow

What patch do I need for this? I’m really curious about the GC numbers :)

Please sign in to comment.
Something went wrong with that request. Please try again.