mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 19:06:14 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			140 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Ruby
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			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
 | 
