Fix for JRUBY-2882. Handle error messages related to constructors better
[jruby.git] / bench / yarv / run.rb
blob6ef294364259c07d431d67e0554f604dcd25d45b
2 # Ruby benchmark driver
5 require 'benchmark'
6 require 'rbconfig'
8 $matzrubyonly = false
9 $rubyonly = false
11 $results  = []
13 # prepare 'wc.input'
14 def prepare_wc_input
15   wcinput = File.join(File.dirname($0), 'wc.input')
16   wcbase  = File.join(File.dirname($0), 'wc.input.base')
17   unless FileTest.exist?(wcinput)
18     data = File.read(wcbase)
19     13.times{
20       data << data
21     }
22     open(wcinput, 'w'){|f| f.write data}
23   end
24 end
26 prepare_wc_input
28 def bm file
29   prog = File.readlines(file).map{|e| e.rstrip}.join("\n")
30   return if prog.empty?
32   /[a-z]+_(.+)\.rb/ =~ file
33   bm_name = $1
34   puts '-----------------------------------------------------------' unless $rubyonly || $matzrubyonly
35   puts "#{bm_name}: "
36   
37   
38 puts <<EOS unless $matzrubyonly || $rubyonly
39 #{prog}
41 EOS
42   begin
43     result = [bm_name]
44     result << matzruby_exec(file) unless $rubyonly
45     result << ruby_exec(file) unless $matzrubyonly
46     $results << result
48   rescue Exception => e
49     puts
50     puts "** benchmark failure: #{e}"
51     puts e.backtrace
52   end
53 end
55 def benchmark file, bin
56   m = Benchmark.measure{
57     `#{bin} #{$opts} #{file}`
58   }
59   sec = '%.3f' % m.real
60   puts " #{sec}"
61   sec
62 end
64 def ruby_exec file
65   print 'ruby'
66   benchmark file, $ruby_program
67 end
69 def matzruby_exec file
70   print 'matz'
71   rubylib = ENV['RUBYLIB']
72   ENV['RUBYLIB'] = ''
73   r = benchmark file, $matzruby_program
74   ENV['RUBYLIB'] = rubylib
75   r
76 end
78 if $0 == __FILE__
79   ARGV.each{|arg|
80     case arg
81     when /\A--ruby=(.+)/
82       $ruby_program = $1
83     when /\A--matzruby=(.+)/
84       $matzruby_program = $1
85     when /\A--opts=(.+)/
86       $opts = $1
87     when /\A(-r|--only-ruby)\z/
88       $rubyonly = true
89     when /\A(-m|--only-matzruby)\z/
90       $matzrubyonly = true
91     end
92   }
93   ARGV.delete_if{|arg|
94     /\A-/ =~ arg
95   }
96   
97   puts "MatzRuby:"
98   system("#{$matzruby_program} -v")
99   puts "Ruby:"
100   system("#{$ruby_program} -v")
101   puts
103   if ARGV.empty?
104     Dir.glob(File.dirname(__FILE__) + '/bm_*.rb').sort.each{|file|
105       bm file
106     }
107   else
108     ARGV.each{|file|
109       Dir.glob(File.join(File.dirname(__FILE__), file + '*')){|ef|
110         # file = "#{File.dirname(__FILE__)}/#{file}.rb"
111         bm ef
112       }
113     }
114   end
116   puts
117   puts "-- benchmark summary ---------------------------"
118   $results.each{|res|
119     print res.shift, "\t"
120     (res||[]).each{|result|
121       /([\d\.]+)/ =~ result
122       print $1 + "\t" if $1
123     }
124     puts
125   }