You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
2.5 KiB
112 lines
2.5 KiB
#!/usr/bin/env ruby
|
|
# encoding: UTF-8
|
|
require 'yaml'
|
|
require 'bigdecimal'
|
|
|
|
BIG_M = 1000000
|
|
|
|
def sum(a)
|
|
a.inject(0){ |accum, i| accum + i }
|
|
end
|
|
|
|
def average(a)
|
|
sum(a) / a.length.to_f
|
|
end
|
|
|
|
def gmean(a)
|
|
prod = BigDecimal.new 2
|
|
a.each { |v| prod *= (BigDecimal.new(v,5))}
|
|
prod ** (1.0 / a.size)
|
|
end
|
|
|
|
def median(a)
|
|
a.sort[a.length / 2]
|
|
end
|
|
|
|
def standard_deviation(a)
|
|
m = average(a)
|
|
sum = a.inject(0){ |accum, i| accum + (i - m) ** 2 }
|
|
Math.sqrt(sum / (a.length - 1).to_f)
|
|
end
|
|
|
|
files = []
|
|
filenames = []
|
|
ARGV.each_with_index do |filename,idx|
|
|
filenames[idx] = filename
|
|
.gsub(/.*\//,"")
|
|
.gsub(".yaml", "")
|
|
.gsub(/[^A-Za-z]/, "")
|
|
files[idx] = YAML::load(File.open(filename))
|
|
end
|
|
|
|
fail_avg = []
|
|
fail_count = []
|
|
success_count = []
|
|
times = []
|
|
all_times = []
|
|
ratios_to_best = []
|
|
|
|
n_instances = files[0]['cpu_time'].length
|
|
|
|
files.each_with_index do |f,idx|
|
|
|
|
fail_count[idx] = 0
|
|
success_count[idx] = 0
|
|
times[idx] = []
|
|
all_times[idx] = []
|
|
ratios_to_best[idx] = []
|
|
|
|
for i in 0..(n_instances-1) do
|
|
time = f['cpu_time'][i]
|
|
next if time.nil?
|
|
|
|
all_times[idx].push(time)
|
|
|
|
if(time == BIG_M)
|
|
fail_count[idx] += 1
|
|
else
|
|
success_count[idx] += 1
|
|
times[idx].push(time)
|
|
end
|
|
end
|
|
|
|
fail_avg[idx] = fail_count[idx].to_f / n_instances
|
|
end
|
|
|
|
best_percentage = [0] * files.length
|
|
|
|
for i in 0..(n_instances-1) do
|
|
best_time = BIG_M
|
|
files.each_with_index do |f,idx|
|
|
time = all_times[idx][i] || BIG_M
|
|
best_time = [best_time, time].min
|
|
end
|
|
|
|
files.each_with_index do |f,idx|
|
|
time = times[idx][i] || BIG_M
|
|
best_percentage[idx] += 1 if time == best_time
|
|
|
|
next if best_time <= 0
|
|
next if time >= BIG_M
|
|
ratios_to_best[idx].push(time / best_time)
|
|
end
|
|
end
|
|
|
|
best_percentage = best_percentage.map{|b| b.to_f / n_instances}
|
|
|
|
def print_line(title, format, arr)
|
|
print "%s," % title
|
|
arr.each do |a|
|
|
print format % a
|
|
end
|
|
print "\n"
|
|
end
|
|
|
|
print_line("metric", "%s,", filenames)
|
|
print_line("Average (ms)", "%.3f,", times.map{|t| average(t)})
|
|
print_line("Median (ms)", "%.3f,", times.map{|t| median(t)})
|
|
print_line("Maximum (ms)", "%.3f,", times.map{|t| t.max})
|
|
print_line("Failure Rate", "%.1f \\%%,", fail_avg.map{|x| 100.0 * x})
|
|
print_line("Best", "%.1f \\%%,", best_percentage.map{|x| 100 * x})
|
|
print_line("Avg Ratio to Best", "%.3f,", ratios_to_best.map{|t| average(t)})
|