* io.c (rb_open_file): encoding in mode string was ignored if perm is
[ruby-svn.git] / tool / eval.rb
blob906ba9c23ca847c8dcd27ce7c615e50e1cc26e90
2 require 'rbconfig'
3 require 'fileutils'
4 require 'pp'
6 Ruby = ENV['RUBY'] ||
7   File.join(Config::CONFIG["bindir"],
8             Config::CONFIG["ruby_install_name"] + Config::CONFIG["EXEEXT"])
11 OPTIONS = %w{
12  opt-direct-threaded-code
13  opt-basic-operations
14  opt-operands-unification
15  opt-instructions-unification
16  opt-inline-method-cache
17  opt-stack-caching
18 }.map{|opt|
19   '--disable-' + opt
22 opts = OPTIONS.dup
23 Configs = OPTIONS.map{|opt|
24   o = opts.dup
25   opts.delete(opt)
26   o
27 } + [[]]
29 pp Configs if $DEBUG
32 def exec_cmd(cmd)
33   puts cmd
34   unless system(cmd)
35     p cmd
36     raise "error"
37   end
38 end
40 def dirname idx
41   "ev-#{idx}"
42 end
44 def build
45   Configs.each_with_index{|config, idx|
46     dir = dirname(idx)
47     FileUtils.rm_rf(dir) if FileTest.exist?(dir)
48     Dir.mkdir(dir)
49     FileUtils.cd(dir){
50       exec_cmd("#{Ruby} ../extconf.rb " + config.join(" "))
51       exec_cmd("make clean test-all")
52     }
53   }
54 end
56 def check
57   Configs.each_with_index{|c, idx|
58     puts "= #{idx}"
59     system("#{Ruby} -r ev-#{idx}/yarvcore -e 'puts YARVCore::OPTS'")
60   }
61 end
63 def bench_each idx
64   puts "= #{idx}"
65   5.times{|count|
66     print count
67     FileUtils.cd(dirname(idx)){
68       exec_cmd("make benchmark OPT=-y ITEMS=#{ENV['ITEMS']} > ../b#{idx}-#{count}")
69     }
70   }
71   puts
72 end
74 def bench
75   # return bench_each(6)
76   Configs.each_with_index{|c, idx|
77     bench_each idx
78   }
79 end
81 def parse_result data
82   flag = false
83   stat = []
84   data.each{|line|
85     if flag
86       if /(\w+)\t([\d\.]+)/ =~ line
87         stat << [$1, $2.to_f]
88       else
89         raise "not a data"
90       end
91       
92     end
93     if /benchmark summary/ =~ line
94       flag = true
95     end
96   }
97   stat
98 end
100 def calc_each data
101   data.sort!
102   data.pop   # remove max
103   data.shift # remove min
105   data.inject(0.0){|res, e|
106     res += e
107   } / data.size
110 def calc_stat stats
111   stat = []
112   stats[0].each_with_index{|e, idx|
113     bm = e[0]
114     vals = stats.map{|st|
115       st[idx][1]
116     }
117     [bm, calc_each(vals)]
118   }
121 def stat
122   total = []
123   Configs.each_with_index{|c, idx|
124     stats = []
125     5.times{|count|
126       file = "b#{idx}-#{count}"
127       # p file
128       open(file){|f|
129         stats << parse_result(f.read)
130       }
131     }
132     # merge stats
133     total << calc_stat(stats)
134     total
135   }
136   # pp total
137   total[0].each_with_index{|e, idx|
138     bm = e[0]
139     # print "#{bm}\t"
140     total.each{|st|
141       print st[idx][1], "\t"
142     }
143     puts
144   }
147 ARGV.each{|cmd|
148   case cmd
149   when 'build'
150     build
151   when 'check'
152     check
153   when 'bench'
154     bench
155   when 'stat'
156     stat
157   else
158     raise
159   end