summaryrefslogtreecommitdiff
path: root/benchmark/run_rite.rb
blob: 3b437c82abf398a716ca0d2151a5af5ca57704eb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#
# YARV benchmark driver
#

require 'benchmark'
require 'rbconfig'

$yarvonly = false
$rubyonly = false

$results  = []

# prepare 'wc.input'
def prepare_wc_input
  wcinput = File.join(File.dirname($0), 'wc.input')
  wcbase  = File.join(File.dirname($0), 'wc.input.base')
  unless FileTest.exist?(wcinput)
    data = File.read(wcbase)
    13.times{
      data << data
    }
    open(wcinput, 'w'){|f| f.write data}
  end
end

prepare_wc_input

def bm file
  prog = File.read(file).map{|e| e.rstrip}.join("\n")
  return if prog.empty?

  /[a-z]+_(.+)\.rb/ =~ file
  bm_name = $1
  puts '-----------------------------------------------------------' unless $yarvonly || $rubyonly
  puts "#{bm_name}: "
  
  
puts <<EOS unless $yarvonly || $rubyonly
#{prog}
--
EOS
  #iseq = YARVUtil.parse(File.read(file))
  #vm   = YARVCore::VM.new
  begin
    result = [bm_name]
    result << ruby_exec(file) unless $yarvonly
    result << yarv_exec(file) unless $rubyonly
    $results << result
    
    # puts YARVUtil.parse(File.read(file), file, 1).disasm
    
    # x.report("ruby"){ load(file, false)    }
    # x.report("yarv"){ vm.eval iseq }
  rescue Exception => e
    puts
    puts "** benchmark failure: #{e}"
    puts e.backtrace
  end
end

def benchmark file, bin
  m = Benchmark.measure{
    `#{bin} #{$opts} #{file}`
  }
  sec = '%.3f' % m.real
  puts " #{sec}"
  sec
end

def ruby_exec file
  print 'ruby'
  benchmark file, $ruby_program
end

def yarv_exec file
  print 'yarv'
  benchmark file, $yarv_program
end

if $0 == __FILE__
  ARGV.each{|arg|
    case arg
    when /\A--yarv-program=(.+)/
      $yarv_program = $1
    when /\A--ruby-program=(.+)/
      $ruby_program = $1
    when /\A--opts=(.+)/
      $opts = $1
    when /\A(--yarv)|(-y)/
      $yarvonly = true
    when /\A(--ruby)|(-r)/
      $rubyonly = true
    end
  }
  ARGV.delete_if{|arg|
    /\A-/ =~ arg
  }
  
  puts "Ruby:"
  system("#{$ruby_program} -v")
  puts
  puts "YARV:"
  system("#{$yarv_program} -v")

  if ARGV.empty?
    Dir.glob(File.dirname(__FILE__) + '/bm_*.rb').sort.each{|file|
      bm file
    }
  else
    ARGV.each{|file|
      Dir.glob(File.join(File.dirname(__FILE__), file + '*')){|ef|
        # file = "#{File.dirname(__FILE__)}/#{file}.rb"
        bm ef
      }
    }
  end

  puts
  puts "-- benchmark summary ---------------------------"
  $results.each{|res|
    print res.shift, "\t"
    (res||[]).each{|result|
      /([\d\.]+)/ =~ result
      print $1 + "\t" if $1
    }
    puts
  }
end