[270] | 1 | module MRuby
|
---|
| 2 | BENCHMARK_REPEAT = 4
|
---|
| 3 | end
|
---|
| 4 |
|
---|
| 5 | $dat_files = []
|
---|
| 6 |
|
---|
| 7 | def bm_files
|
---|
| 8 | Dir.glob("#{MRUBY_ROOT}/benchmark/bm_*.rb")
|
---|
| 9 | end
|
---|
| 10 |
|
---|
| 11 | def build_config_name
|
---|
| 12 | if ENV['MRUBY_CONFIG']
|
---|
| 13 | File.basename(ENV['MRUBY_CONFIG'], '.rb').gsub('build_config_', '')
|
---|
| 14 | else
|
---|
| 15 | "build"
|
---|
| 16 | end
|
---|
| 17 | end
|
---|
| 18 |
|
---|
| 19 | def plot_file
|
---|
| 20 | File.join(MRUBY_ROOT, 'benchmark', "#{build_config_name}.png")
|
---|
| 21 | end
|
---|
| 22 |
|
---|
| 23 | def plot
|
---|
| 24 | opts_file = "#{MRUBY_ROOT}/benchmark/plot.gpl"
|
---|
| 25 | opts = File.read(opts_file).each_line.to_a.map(&:strip).join(';')
|
---|
| 26 |
|
---|
| 27 | dat_files = $dat_files.group_by {|f| File.dirname(f).split(File::SEPARATOR)[-1]}
|
---|
| 28 |
|
---|
| 29 | opts += ";set output '#{plot_file}'"
|
---|
| 30 |
|
---|
| 31 | opts += ';plot '
|
---|
| 32 |
|
---|
| 33 | opts += dat_files.keys.map do |data_file|
|
---|
| 34 | %Q['-' u 2:3:4:xtic(1) w hist title columnheader(1)]
|
---|
| 35 | end.join(',')
|
---|
| 36 | opts += ';'
|
---|
| 37 |
|
---|
| 38 | cmd = %Q{gnuplot -p -e "#{opts}"}
|
---|
| 39 |
|
---|
| 40 | IO.popen(cmd, 'w') do |p|
|
---|
| 41 | dat_files.each do |target_name, bm_files|
|
---|
| 42 | p.puts target_name.gsub('_', '-')
|
---|
| 43 | bm_files.each do |bm_file|
|
---|
| 44 | p.write File.read(bm_file)
|
---|
| 45 | end
|
---|
| 46 | p.puts "e"
|
---|
| 47 | end
|
---|
| 48 | end
|
---|
| 49 | end
|
---|
| 50 |
|
---|
| 51 |
|
---|
| 52 | MRuby.each_target do |target|
|
---|
| 53 | next if target.name == 'host'
|
---|
| 54 | mruby_bin = "#{target.build_dir}/bin/mruby"
|
---|
| 55 |
|
---|
| 56 | bm_files.each do |bm_file|
|
---|
| 57 | bm_name = File.basename bm_file, ".rb"
|
---|
| 58 |
|
---|
| 59 | dat_dir = File.join('benchmark', build_config_name, target.name)
|
---|
| 60 | dat_file = File.join(dat_dir, "#{bm_name}.dat")
|
---|
| 61 | $dat_files << dat_file
|
---|
| 62 |
|
---|
| 63 | directory dat_dir
|
---|
| 64 |
|
---|
| 65 | file dat_file => [bm_file, dat_dir, mruby_bin] do |task|
|
---|
| 66 | print bm_name
|
---|
| 67 | puts "..."
|
---|
| 68 |
|
---|
| 69 | data = (0...MRuby::BENCHMARK_REPEAT).map do |n|
|
---|
| 70 | str = %x{(time -f "%e %S %U" #{mruby_bin} #{bm_file}) 2>&1 >/dev/null}
|
---|
| 71 | str.split(' ').map(&:to_f)
|
---|
| 72 | end
|
---|
| 73 |
|
---|
| 74 | File.open(task.name, "w") do |f|
|
---|
| 75 | data = data.map {|_,r,s| (r + s) / 2.0}
|
---|
| 76 | min = data.min
|
---|
| 77 | max = data.max
|
---|
| 78 | avg = data.inject(&:+) / data.size
|
---|
| 79 | f.puts "#{bm_name.gsub('_', '-')} #{avg} #{min} #{max}"
|
---|
| 80 | end
|
---|
| 81 | end
|
---|
| 82 | end
|
---|
| 83 | end
|
---|
| 84 |
|
---|
| 85 | file plot_file => $dat_files do
|
---|
| 86 | plot
|
---|
| 87 | end
|
---|
| 88 |
|
---|
| 89 | task :benchmark => plot_file do
|
---|
| 90 | plot
|
---|
| 91 | end
|
---|