def initialize(file)
@entries = []
file.each_line do |line|
case line
when /^.*perf_([a-zA-Z.]+)\s+(\d+)\s+(.*)$/
@iterations = $2.to_i
@options = $3
when /\s+user\s+system\s+total\s+real/
@entries << PerfEntry.new
when /^(.*)\s+([\d\.]+)\s+([\d\.]+)\s+([\d\.]+)\s+\(\s*([\d\.]+)\s*\)$/
key, time = $1.strip, $5.to_f
if key == "loading environment"
@entries.last.load_time = time
else
@entries.last.keys << key
@entries.last.timings[key] = time
end
when /^GC.collections=(\d+), GC.time=([\d\.]+)$/
@entries.last.gc_calls, @entries.last.gc_time = [$1.to_i,$2.to_f]
@gc_stats = true
end
end
@entries.each{ |e| e.total_time = e.timings.values.sum }
@keys = @entries.first.keys
@runs = @entries.length
if @keys.length == 1 && @keys[0] =~ /\((\d+) urls\)$/
@requests_per_key = $1.to_i
else
@requests_per_key = 1
end
@request_count = @iterations * @keys.length * @requests_per_key
@timings = PerfSummaries.inject({}){ |hash, method| hash[method] = Hash.new; hash }
@keys.each do |k|
a = @entries.map{|e| e.timings[k]}
[:min, :max, :mean].each do |method|
@timings[method][k] = a.send(method)
end
mean = @timings[:mean][k]
stddev = @timings[:stddev][k] = a.send(:stddev, mean)
@timings[:stddev_percentage][k] = stddev_percentage(stddev, mean)
end
PerfAttributes.each do |attr|
next if attr.to_s =~ /^gc_/ and !gc_stats?
a = @entries.map{|e| e.send attr}
[:min, :max, :mean].each do |method|
instance_variable_set "@#{attr}_#{method}", (a.send method)
end
mean = instance_variable_get "@#{attr}_mean"
stddev = instance_variable_set "@#{attr}_stddev", (a.send :stddev, mean)
instance_variable_set "@#{attr}_stddev_percentage", stddev_percentage(stddev, mean)
end
end