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
|
---|