mariadb/storage/mroonga/vendor/groonga/benchmark/geo-distance-summary.rb

140 lines
3.2 KiB
Ruby
Executable file

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'fileutils'
require 'optparse'
class BenchmarkSummary
attr_accessor :options
def initialize(options)
@options = options
@options[:count] ||= 10
end
def calc_total(data)
total = {}
@options[:count].times do |i|
data[i + 1].each do |key, value|
if total[key]
total[key] = total[key] + value
else
total[key] = value
end
end
end
total
end
def print_average(data)
total = calc_total(data)
text = "|項目|"
@options[:count].times do |i|
text << "#{i + 1}|"
text << "平均|\n" if i == @options[:count] - 1
end
total.each do |key, value|
line = [key]
@options[:count].times do |i|
data[i + 1].each do |data_key, data_value|
if key == data_key
line << data_value
end
end
end
line << [value / @options[:count].to_f]
text << sprintf("|%s|\n", line.join("|"))
end
puts text
end
def print_performance(before, after)
before_total = calc_total(before)
after_total = calc_total(after)
ratio = {}
before_total.each do |key, value|
ratio[key] = after_total[key] / value
end
text = "|項目|変更前|変更後|比率|備考|\n"
ratio.each do |key, value|
text << sprintf("|%s|%f|%f|%f||\n",
key,
before_total[key] / @options[:count].to_f,
after_total[key] / @options[:count].to_f,
ratio[key])
end
puts text
end
def parse_log(logs)
parse_result = {}
logs.each do |index, log|
File.open(log, "r") do |file|
data = file.read
entry = {}
data.split("\n").each do |line|
if line =~ /\s*(.+?):\s+\((.+)\)/
entry[$1] = $2.to_f
end
end
parse_result[index] = entry
end
end
parse_result
end
end
=begin
Usage: geo-distance-summary.rb \
-b run-bench-geo-distance-orig-N1000 \
-a run-bench-geo-distance-work-N1000
NOTE: expected that there are run-bench-geo-distance-orig-N1000-1.log \
... \
run-bench-geo-distance-orig-N1000-[N].log.
=end
if __FILE__ == $0
options = {}
parser = OptionParser.new
parser.on("-b", "--before PREFIX",
"log file name must be PREFIX-[N].log") do |prefix|
options[:before] = prefix
end
parser.on("-a", "--after PREFIX",
"log file name must be PREFIX-[N].log") do |prefix|
options[:after] = prefix
end
parser.on("-n", "data count") do |count|
options[:count] = count
end
parser.parse!(ARGV)
if not options.has_key?(:before) or not options.has_key?(:after)
puts(parser.to_s)
exit
end
bench_before_log = {}
bench_after_log = {}
Dir.glob("#{options[:before]}*.log") do |log|
log =~ /(.+)-(\d+)\.log$/
bench_before_log[$2.to_i] = log
end
Dir.glob("#{options[:after]}*.log") do |log|
log =~ /(.+)-(\d+)\.log$/
bench_after_log[$2.to_i] = log
end
bench = BenchmarkSummary.new(options)
bench_before = bench.parse_log(bench_before_log)
bench_after = bench.parse_log(bench_after_log)
bench.print_average(bench_before)
bench.print_average(bench_after)
bench.print_performance(bench_before, bench_after)
end