1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* Merge YARV

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11439 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ko1 2006-12-31 15:02:22 +00:00
parent 3e7566d8fb
commit a3e1b1ce7e
233 changed files with 46004 additions and 13653 deletions

View file

@ -0,0 +1,15 @@
def ack(m, n)
if m == 0 then
n + 1
elsif n == 0 then
ack(m - 1, 1)
else
ack(m - 1, ack(m, n - 1))
end
end
def the_answer_to_life_the_universe_and_everything
(ack(3,7).to_s.split(//).inject(0){|s,x| s+x.to_i}.to_s + "2" ).to_i
end
answer = the_answer_to_life_the_universe_and_everything

View file

@ -0,0 +1,11 @@
def fact(n)
if(n > 1)
n * fact(n-1)
else
1
end
end
8.times{
fact(5000)
}

10
benchmark/bm_app_fib.rb Normal file
View file

@ -0,0 +1,10 @@
def fib n
if n < 3
1
else
fib(n-1) + fib(n-2)
end
end
fib(34)

View file

@ -0,0 +1,23 @@
require 'complex'
def mandelbrot? z
i = 0
while i<100
i+=1
z = z * z
return false if z.abs > 2
end
true
end
ary = []
(0..100).each{|dx|
(0..100).each{|dy|
x = dx / 50.0
y = dy / 50.0
c = Complex(x, y)
ary << c if mandelbrot?(c)
}
}

View file

@ -0,0 +1,259 @@
#!/usr/local/bin/ruby
# This program is contributed by Shin Nishiyama
# modified by K.Sasada
NP = 5
ROW = 8 + NP
COL = 8
$p = []
$b = []
$no = 0
def piece(n, a, nb)
nb.each{|x|
a[n] = x
if n == NP-1
$p << [a.sort]
else
nbc=nb.clone
[-ROW, -1, 1, ROW].each{|d|
if x+d > 0 and not a.include?(x+d) and not nbc.include?(x+d)
nbc << x+d
end
}
nbc.delete x
piece(n+1,a[0..n],nbc)
end
}
end
def kikaku(a)
a.collect {|x| x - a[0]}
end
def ud(a)
kikaku(a.collect {|x| ((x+NP)%ROW)-ROW*((x+NP)/ROW) }.sort)
end
def rl(a)
kikaku(a.collect {|x| ROW*((x+NP)/ROW)+ROW-((x+NP)%ROW)}.sort)
end
def xy(a)
kikaku(a.collect {|x| ROW*((x+NP)%ROW) + (x+NP)/ROW }.sort)
end
def mkpieces
piece(0,[],[0])
$p.each do |a|
a0 = a[0]
a[1] = ud(a0)
a[2] = rl(a0)
a[3] = ud(rl(a0))
a[4] = xy(a0)
a[5] = ud(xy(a0))
a[6] = rl(xy(a0))
a[7] = ud(rl(xy(a0)))
a.sort!
a.uniq!
end
$p.uniq!.sort! {|x,y| x[0] <=> y[0] }
end
def mkboard
(0...ROW*COL).each{|i|
if i % ROW >= ROW-NP
$b[i] = -2
else
$b[i] = -1
end
$b[3*ROW+3]=$b[3*ROW+4]=$b[4*ROW+3]=$b[4*ROW+4]=-2
}
end
def pboard
return # skip print
print "No. #$no\n"
(0...COL).each{|i|
print "|"
(0...ROW-NP).each{|j|
x = $b[i*ROW+j]
if x < 0
print "..|"
else
printf "%2d|",x+1
end
}
print "\n"
}
print "\n"
end
$pnum=[]
def setpiece(a,pos)
if a.length == $p.length then
$no += 1
pboard
return
end
while $b[pos] != -1
pos += 1
end
($pnum - a).each do |i|
$p[i].each do |x|
f = 0
x.each{|s|
if $b[pos+s] != -1
f=1
break
end
}
if f == 0 then
x.each{|s|
$b[pos+s] = i
}
a << i
setpiece(a.clone, pos)
a.pop
x.each{|s|
$b[pos+s] = -1
}
end
end
end
end
mkpieces
mkboard
$p[4] = [$p[4][0]]
$pnum = (0...$p.length).to_a
setpiece([],0)
__END__
# original
NP = 5
ROW = 8 + NP
COL = 8
$p = []
$b = []
$no = 0
def piece(n,a,nb)
for x in nb
a[n] = x
if n == NP-1
$p << [a.sort]
else
nbc=nb.clone
for d in [-ROW, -1, 1, ROW]
if x+d > 0 and not a.include?(x+d) and not nbc.include?(x+d)
nbc << x+d
end
end
nbc.delete x
piece(n+1,a[0..n],nbc)
end
end
end
def kikaku(a)
a.collect {|x| x - a[0]}
end
def ud(a)
kikaku(a.collect {|x| ((x+NP)%ROW)-ROW*((x+NP)/ROW) }.sort)
end
def rl(a)
kikaku(a.collect {|x| ROW*((x+NP)/ROW)+ROW-((x+NP)%ROW)}.sort)
end
def xy(a)
kikaku(a.collect {|x| ROW*((x+NP)%ROW) + (x+NP)/ROW }.sort)
end
def mkpieces
piece(0,[],[0])
$p.each do |a|
a0 = a[0]
a[1] = ud(a0)
a[2] = rl(a0)
a[3] = ud(rl(a0))
a[4] = xy(a0)
a[5] = ud(xy(a0))
a[6] = rl(xy(a0))
a[7] = ud(rl(xy(a0)))
a.sort!
a.uniq!
end
$p.uniq!.sort! {|x,y| x[0] <=> y[0] }
end
def mkboard
for i in 0...ROW*COL
if i % ROW >= ROW-NP
$b[i] = -2
else
$b[i] = -1
end
$b[3*ROW+3]=$b[3*ROW+4]=$b[4*ROW+3]=$b[4*ROW+4]=-2
end
end
def pboard
print "No. #$no\n"
for i in 0...COL
print "|"
for j in 0...ROW-NP
x = $b[i*ROW+j]
if x < 0
print "..|"
else
printf "%2d|",x+1
end
end
print "\n"
end
print "\n"
end
$pnum=[]
def setpiece(a,pos)
if a.length == $p.length then
$no += 1
pboard
return
end
while $b[pos] != -1
pos += 1
end
($pnum - a).each do |i|
$p[i].each do |x|
f = 0
for s in x do
if $b[pos+s] != -1
f=1
break
end
end
if f == 0 then
for s in x do
$b[pos+s] = i
end
a << i
setpiece(a.clone, pos)
a.pop
for s in x do
$b[pos+s] = -1
end
end
end
end
end
mkpieces
mkboard
$p[4] = [$p[4][0]]
$pnum = (0...$p.length).to_a
setpiece([],0)

View file

@ -0,0 +1,8 @@
i=0
while i<300000
i+=1
begin
raise
rescue
end
end

View file

@ -0,0 +1,5 @@
i=0
while i<500000
"#{1+1} #{1+1} #{1+1}"
i+=1
end

13
benchmark/bm_app_tak.rb Normal file
View file

@ -0,0 +1,13 @@
def tak x, y, z
unless y < x
z
else
tak( tak(x-1, y, z),
tak(y-1, z, x),
tak(z-1, x, y))
end
end
tak(18, 9, 0)

10
benchmark/bm_app_tarai.rb Normal file
View file

@ -0,0 +1,10 @@
def tarai( x, y, z )
if x <= y
then y
else tarai(tarai(x-1, y, z),
tarai(y-1, z, x),
tarai(z-1, x, y))
end
end
tarai(12, 6, 0)

View file

@ -0,0 +1 @@
30000000.times{|e|}

View file

@ -0,0 +1,4 @@
i = 0
while i<30000000 # benchmark loop 1
i+=1
end

View file

@ -0,0 +1,5 @@
i=0
while i<6000000 # benchmark loop 2
i+=1
end

View file

@ -0,0 +1,19 @@
#!/usr/bin/ruby
# -*- mode: ruby -*-
# $Id: ackermann-ruby.code,v 1.4 2004/11/13 07:40:41 bfulgham Exp $
# http://www.bagley.org/~doug/shootout/
def ack(m, n)
if m == 0 then
n + 1
elsif n == 0 then
ack(m - 1, 1)
else
ack(m - 1, ack(m, n - 1))
end
end
NUM = 9
ack(3, NUM)

23
benchmark/bm_so_array.rb Normal file
View file

@ -0,0 +1,23 @@
#!/usr/bin/ruby
# -*- mode: ruby -*-
# $Id: ary-ruby.code,v 1.4 2004/11/13 07:41:27 bfulgham Exp $
# http://www.bagley.org/~doug/shootout/
# with help from Paul Brannan and Mark Hubbart
n = 9000 # Integer(ARGV.shift || 1)
x = Array.new(n)
y = Array.new(n, 0)
n.times{|bi|
x[bi] = bi + 1
}
(0 .. 999).each do |e|
(n-1).step(0,-1) do |bi|
y[bi] += x.at(bi)
end
end
# puts "#{y.first} #{y.last}"

View file

@ -0,0 +1,18 @@
#!/usr/bin/ruby
# -*- mode: ruby -*-
# $Id: strcat-ruby.code,v 1.4 2004/11/13 07:43:28 bfulgham Exp $
# http://www.bagley.org/~doug/shootout/
# based on code from Aristarkh A Zagorodnikov and Dat Nguyen
STUFF = "hello\n"
i=0
while i<10
i+=1
hello = ''
400000.times do |e|
hello << STUFF
end
end
# puts hello.length

View file

@ -0,0 +1,18 @@
#!/usr/bin/ruby
# -*- mode: ruby -*-
# $Id: wc-ruby.code,v 1.4 2004/11/13 07:43:32 bfulgham Exp $
# http://www.bagley.org/~doug/shootout/
# with help from Paul Brannan
input = open(File.join(File.dirname($0), 'wc.input'), 'rb')
nl = nw = nc = 0
while true
data = (input.read(4096) or break) << (input.gets || "")
nc += data.length
nl += data.count("\n")
((data.strip! || data).tr!("\n", " ") || data).squeeze!
#nw += data.count(" ") + 1
end
# STDERR.puts "#{nl} #{nw} #{nc}"

View file

@ -0,0 +1,61 @@
#!/usr/bin/ruby
# -*- mode: ruby -*-
# $Id: except-ruby.code,v 1.4 2004/11/13 07:41:33 bfulgham Exp $
# http://www.bagley.org/~doug/shootout/
$HI = 0
$LO = 0
NUM = 250000 # Integer(ARGV[0] || 1)
class Lo_Exception < Exception
def initialize(num)
@value = num
end
end
class Hi_Exception < Exception
def initialize(num)
@value = num
end
end
def some_function(num)
begin
hi_function(num)
rescue
print "We shouldn't get here, exception is: #{$!.type}\n"
end
end
def hi_function(num)
begin
lo_function(num)
rescue Hi_Exception
$HI = $HI + 1
end
end
def lo_function(num)
begin
blowup(num)
rescue Lo_Exception
$LO = $LO + 1
end
end
def blowup(num)
if num % 2 == 0
raise Lo_Exception.new(num)
else
raise Hi_Exception.new(num)
end
end
i = 1
max = NUM+1
while i < max
i+=1
some_function(i+1)
end

47
benchmark/bm_so_lists.rb Normal file
View file

@ -0,0 +1,47 @@
#from http://www.bagley.org/~doug/shootout/bench/lists/lists.ruby
NUM = 100
SIZE = 10000
def test_lists()
# create a list of integers (Li1) from 1 to SIZE
li1 = (1..SIZE).to_a
# copy the list to li2 (not by individual items)
li2 = li1.dup
# remove each individual item from left side of li2 and
# append to right side of li3 (preserving order)
li3 = Array.new
while (not li2.empty?)
li3.push(li2.shift)
end
# li2 must now be empty
# remove each individual item from right side of li3 and
# append to right side of li2 (reversing list)
while (not li3.empty?)
li2.push(li3.pop)
end
# li3 must now be empty
# reverse li1 in place
li1.reverse!
# check that first item is now SIZE
if li1[0] != SIZE then
p "not SIZE"
0
else
# compare li1 and li2 for equality
if li1 != li2 then
return(0)
else
# return the length of the list
li1.length
end
end
end
i = 0
while i<NUM
i+=1
result = test_lists()
end
result

48
benchmark/bm_so_matrix.rb Normal file
View file

@ -0,0 +1,48 @@
#!/usr/bin/ruby
# -*- mode: ruby -*-
# $Id: matrix-ruby.code,v 1.4 2004/11/13 07:42:14 bfulgham Exp $
# http://www.bagley.org/~doug/shootout/
n = 60 #Integer(ARGV.shift || 1)
size = 30
def mkmatrix(rows, cols)
count = 1
mx = Array.new(rows)
(0 .. (rows - 1)).each do |bi|
row = Array.new(cols, 0)
(0 .. (cols - 1)).each do |j|
row[j] = count
count += 1
end
mx[bi] = row
end
mx
end
def mmult(rows, cols, m1, m2)
m3 = Array.new(rows)
(0 .. (rows - 1)).each do |bi|
row = Array.new(cols, 0)
(0 .. (cols - 1)).each do |j|
val = 0
(0 .. (cols - 1)).each do |k|
val += m1.at(bi).at(k) * m2.at(k).at(j)
end
row[j] = val
end
m3[bi] = row
end
m3
end
m1 = mkmatrix(size, size)
m2 = mkmatrix(size, size)
mm = Array.new
n.times do
mm = mmult(size, size, m1, m2)
end
# puts "#{mm[0][0]} #{mm[2][3]} #{mm[3][2]} #{mm[4][4]}"

View file

@ -0,0 +1,24 @@
#!/usr/bin/ruby
# -*- mode: ruby -*-
# $Id: nestedloop-ruby.code,v 1.4 2004/11/13 07:42:22 bfulgham Exp $
# http://www.bagley.org/~doug/shootout/
# from Avi Bryant
n = 16 # Integer(ARGV.shift || 1)
x = 0
n.times do
n.times do
n.times do
n.times do
n.times do
n.times do
x += 1
end
end
end
end
end
end
# puts x

56
benchmark/bm_so_object.rb Normal file
View file

@ -0,0 +1,56 @@
#!/usr/bin/ruby
# -*- mode: ruby -*-
# $Id: objinst-ruby.code,v 1.4 2004/11/13 07:42:25 bfulgham Exp $
# http://www.bagley.org/~doug/shootout/
# with help from Aristarkh Zagorodnikov
class Toggle
def initialize(start_state)
@bool = start_state
end
def value
@bool
end
def activate
@bool = !@bool
self
end
end
class NthToggle < Toggle
def initialize(start_state, max_counter)
super start_state
@count_max = max_counter
@counter = 0
end
def activate
@counter += 1
if @counter >= @count_max
@bool = !@bool
@counter = 0
end
self
end
end
n = 1500000 # (ARGV.shift || 1).to_i
toggle = Toggle.new 1
5.times do
toggle.activate.value ? 'true' : 'false'
end
n.times do
toggle = Toggle.new 1
end
ntoggle = NthToggle.new 1, 3
8.times do
ntoggle.activate.value ? 'true' : 'false'
end
n.times do
ntoggle = NthToggle.new 1, 3
end

20
benchmark/bm_so_random.rb Normal file
View file

@ -0,0 +1,20 @@
# from http://www.bagley.org/~doug/shootout/bench/random/random.ruby
IM = 139968.0
IA = 3877.0
IC = 29573.0
$last = 42.0
def gen_random(max)
(max * ($last = ($last * IA + IC) % IM)) / IM
end
N = 1000000
i=0
while i<N
i+=1
gen_random(100.0)
end
# "%.9f" % gen_random(100.0)

24
benchmark/bm_so_sieve.rb Normal file
View file

@ -0,0 +1,24 @@
# from http://www.bagley.org/~doug/shootout/bench/sieve/sieve.ruby
num = 40
count = i = j = 0
flags0 = Array.new(8192,1)
k = 0
while k < num
k+=1
count = 0
flags = flags0.dup
i = 2
while i<8192
i+=1
if flags[i]
# remove all multiples of prime: i
j = i*i
while j < 8192
j += i
flags[j] = nil
end
count += 1
end
end
end
count

10
benchmark/bm_vm1_block.rb Normal file
View file

@ -0,0 +1,10 @@
def m
yield
end
i=0
while i<30000000 # while loop 1
i+=1
m{
}
end

View file

@ -0,0 +1,8 @@
Const = 1
i = 0
while i<30000000 # while loop 1
i+= 1
j = Const
k = Const
end

View file

@ -0,0 +1,11 @@
i=0
while i<30000000 # benchmark loop 1
i+=1
begin
begin
ensure
end
ensure
end
end

View file

@ -0,0 +1,9 @@
a = 'abc'
b = [1, 2, 3]
i=0
while i<30000000 # while loop 1
i+=1
a.length
b.length
end

View file

@ -0,0 +1,7 @@
i=0
while i<30000000 # while loop 1
i+=1
begin
rescue
end
end

View file

@ -0,0 +1,9 @@
def m
return 1
end
i=0
while i<30000000 # while loop 1
i+=1
m
end

8
benchmark/bm_vm1_swap.rb Normal file
View file

@ -0,0 +1,8 @@
a = 1
b = 2
i=0
while i<30000000 # while loop 1
i+=1
a, b = b, a
end

View file

@ -0,0 +1,5 @@
i=0
while i<6000000 # benchmark loop 2
i+=1
a = [1,2,3,4,5,6,7,8,9,10]
end

View file

@ -0,0 +1,9 @@
def m
nil
end
i=0
while i<6000000 # benchmark loop 2
i+=1
m; m; m; m; m; m; m; m;
end

View file

@ -0,0 +1,20 @@
class C1
def m
1
end
end
class C2
def m
2
end
end
o1 = C1.new
o2 = C2.new
i=0
while i<6000000 # benchmark loop 2
o = (i % 2 == 0) ? o1 : o2
o.m; o.m; o.m; o.m; o.m; o.m; o.m; o.m
i+=1
end

View file

@ -0,0 +1,20 @@
class C1
def m
1
end
end
class C2
def m
2
end
end
o1 = C1.new
o2 = C2.new
i=0
while i<6000000 # benchmark loop 2
o = (i % 2 == 0) ? o1 : o2
# o.m; o.m; o.m; o.m; o.m; o.m; o.m; o.m
i+=1
end

14
benchmark/bm_vm2_proc.rb Normal file
View file

@ -0,0 +1,14 @@
def m &b
b
end
pr = m{
a = 1
}
i=0
while i<6000000 # benchmark loop 2
i+=1
pr.call
end

View file

@ -0,0 +1,6 @@
i=0
str = 'xxxhogexxx'
while i<6000000 # benchmark loop 2
/hoge/ =~ str
i+=1
end

12
benchmark/bm_vm2_send.rb Normal file
View file

@ -0,0 +1,12 @@
class C
def m
end
end
o = C.new
i=0
while i<6000000 # benchmark loop 2
i+=1
o.__send__ :m
end

20
benchmark/bm_vm2_super.rb Normal file
View file

@ -0,0 +1,20 @@
class C
def m
1
end
end
class CC < C
def m
super()
end
end
obj = CC.new
i = 0
while i<6000000 # benchmark loop 2
obj.m
i+=1
end

View file

@ -0,0 +1,8 @@
i = 0
def m a, b
end
while i<6000000 # benchmark loop 2
i+=1
m 100, 200
end

View file

@ -0,0 +1,20 @@
i = 0
class C
def m a
1
end
end
class CC < C
def m a
super
end
end
obj = CC.new
while i<6000000 # benchmark loop 2
obj.m 10
i+=1
end

View file

@ -0,0 +1,6 @@
i=0
while i<1000 # benchmark loop 3
i+=1
Thread.new{
}.join
end

57
benchmark/bmx_temp.rb Normal file
View file

@ -0,0 +1,57 @@
i=0
while i<20000000
x = 1 # "foo"
i+=1
end
__END__
class Range
def each
f = self.first
l = self.last
while f < l
yield
f = f.succ
end
end
end
(0..10000000).each{
}
__END__
class Fixnum_
def times
i = 0
while i<self
yield(i)
i+=1
end
end
end
10000000.times{
}
__END__
ths = (1..10).map{
Thread.new{
1000000.times{
}
}
}
ths.each{|e|
e.join
}
__END__
$pr = proc{}
def m
$pr.call
end
1000000.times{|e|
m
}

View file

@ -0,0 +1,11 @@
use integer;
sub Ack {
return $_[0] ? ($_[1] ? Ack($_[0]-1, Ack($_[0], $_[1]-1))
: Ack($_[0]-1, 1))
: $_[1]+1;
}
my $NUM = 9;
$NUM = 1 if ($NUM < 1);
my $ack = Ack(3, $NUM);

View file

@ -0,0 +1,16 @@
import sys
sys.setrecursionlimit(5000000)
def Ack(M, N):
if (not M):
return( N + 1 )
if (not N):
return( Ack(M-1, 1) )
return( Ack(M-1, Ack(M, N-1)) )
def main():
NUM = 9
sys.setrecursionlimit(10000)
Ack(3, NUM)
main()

View file

@ -0,0 +1,12 @@
def ack(m, n)
if m == 0 then
n + 1
elsif n == 0 then
ack(m - 1, 1)
else
ack(m - 1, ack(m, n - 1))
end
end
NUM = 9
ack(3, NUM)

View file

@ -0,0 +1,7 @@
(define (ack m n)
(cond ((zero? m) (+ n 1))
((zero? n) (ack (- m 1) 1))
(else (ack (- m 1) (ack m (- n 1))))))
(ack 3 9)

View file

@ -0,0 +1,66 @@
Bench = %w(
loop
ack
fib
tak
fact
)
Lang = <<EOP.map{|l| l.strip}
ruby-cyg
../../../test6/miniruby
perl
python
gosh
EOP
Bench.replace ['loop2']
Lang.replace ['ruby-cyg']
Ext = %w(
.rb
.rb
.pl
.py
.scm
)
p Bench
p Lang
require 'benchmark'
def bench cmd
m = Benchmark.measure{
#p cmd
system(cmd)
}
[m.utime, m.real]
end
Result = []
Bench.each{|b|
r = []
Lang.each_with_index{|l, idx|
cmd = "#{l} #{b}#{Ext[idx]}"
r << bench(cmd)
}
Result << r
}
require 'pp'
# utime
puts Lang.join("\t")
Bench.each_with_index{|b, bi|
print b, "\t"
puts Result[bi].map{|e| e[0]}.join("\t")
}
# rtime
puts Lang.join("\t")
Bench.each_with_index{|b, bi|
print b, "\t"
puts Result[bi].map{|e| e[1]}.join("\t")
}

View file

@ -0,0 +1,13 @@
sub fact{
my $n = @_[0];
if($n < 2){
return 1;
}
else{
return $n * fact($n-1);
}
}
for($i=0; $i<10000; $i++){
&fact(100);
}

View file

@ -0,0 +1,18 @@
#import sys
#sys.setrecursionlimit(1000)
def factL(n):
r = 1
for x in range(2, n):
r *= x
return r
def factR(n):
if n < 2:
return 1
else:
return n * factR(n-1)
for i in range(10000):
factR(100)

View file

@ -0,0 +1,13 @@
def fact(n)
if n < 2
1
else
n * fact(n-1)
end
end
i=0
while i<10000
i+=1
fact(100)
end

View file

@ -0,0 +1,8 @@
(define (fact n)
(if (< n 2)
1
(* n (fact (- n 1)))))
(dotimes (i 10000)
(fact 100))

View file

@ -0,0 +1,11 @@
sub fib{
my $n = $_[0];
if($n < 3){
return 1;
}
else{
return fib($n-1) + fib($n-2);
}
};
&fib(34);

View file

@ -0,0 +1,7 @@
def fib(n):
if n < 3:
return 1
else:
return fib(n-1) + fib(n-2)
fib(34)

View file

@ -0,0 +1,9 @@
def fib n
if n < 3
1
else
fib(n-1) + fib(n-2)
end
end
fib(34)

View file

@ -0,0 +1,7 @@
(define (fib n)
(if (< n 3)
1
(+ (fib (- n 1)) (fib (- n 2)))))
(fib 34)

View file

@ -0,0 +1,3 @@
for($i=0; $i<30000000; $i++){
}

View file

@ -0,0 +1,2 @@
for i in xrange(30000000):
pass

View file

@ -0,0 +1,4 @@
i=0
while i<30000000
i+=1
end

View file

@ -0,0 +1 @@
(dotimes (x 30000000))

View file

@ -0,0 +1 @@
30000000.times{}

View file

@ -0,0 +1,11 @@
sub tak {
local($x, $y, $z) = @_;
if (!($y < $x)) {
return $z;
} else {
return &tak(&tak($x - 1, $y, $z),
&tak($y - 1, $z, $x),
&tak($z - 1, $x, $y));
}
}
&tak(18, 9, 0);

View file

@ -0,0 +1,8 @@
def tak(x, y, z):
if not(y<x):
return z
else:
return tak(tak(x-1, y, z),
tak(y-1, z, x),
tak(z-1, x, y))
tak(18, 9, 0)

View file

@ -0,0 +1,13 @@
def tak x, y, z
unless y < x
z
else
tak( tak(x-1, y, z),
tak(y-1, z, x),
tak(z-1, x, y))
end
end
tak(18, 9, 0)

View file

@ -0,0 +1,10 @@
(define (tak x y z)
(if (not (< y x))
z
(tak (tak (- x 1) y z)
(tak (- y 1) z x)
(tak (- z 1) x y))))
(tak 18 9 0)

81
benchmark/report.rb Normal file
View file

@ -0,0 +1,81 @@
#
# YARV benchmark driver
#
require 'yarvutil'
require 'benchmark'
require 'rbconfig'
def exec_command type, file, w
<<-EOP
$DRIVER_PATH = '#{File.dirname($0)}'
$LOAD_PATH.replace $LOAD_PATH | #{$LOAD_PATH.inspect}
require 'benchmark'
require 'yarvutil'
# print '#{type}'
begin
puts Benchmark.measure{
#{w}('#{file}')
}.utime
rescue Exception => exec_command_error_variable
puts "\t" + exec_command_error_variable.message
end
EOP
end
def benchmark cmd
rubybin = ENV['RUBY'] || File.join(
Config::CONFIG["bindir"],
Config::CONFIG["ruby_install_name"] + Config::CONFIG["EXEEXT"])
IO.popen(rubybin, 'r+'){|io|
io.write cmd
io.close_write
return io.gets
}
end
def ruby_exec file
prog = exec_command 'ruby', file, 'load'
benchmark prog
end
def yarv_exec file
prog = exec_command 'yarv', file, 'YARVUtil.load_bm'
benchmark prog
end
$wr = $wy = nil
def measure bench
file = File.dirname($0) + "/bm_#{bench}.rb"
r = ruby_exec(file).to_f
y = yarv_exec(file).to_f
puts "#{bench}\t#{r}\t#{y}"
end
def measure2
r = ruby_exec.to_f
y = yarv_exec.to_f
puts r/y
end
if $0 == __FILE__
%w{
whileloop
whileloop2
times
const
method
poly_method
block
rescue
rescue2
}.each{|bench|
measure bench
}
end

137
benchmark/run.rb Normal file
View file

@ -0,0 +1,137 @@
#
# YARV benchmark driver
#
require 'yarvutil'
require 'benchmark'
require 'rbconfig'
$yarvonly = false
$rubyonly = false
$results = []
puts "ruby #{RUBY_VERSION} #{RUBY_PLATFORM}(#{RUBY_RELEASE_DATE})"
puts YARVCore::VERSION + " rev: #{YARVCore::REV} (#{YARVCore::DATE})"
puts YARVCore::OPTS
puts
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
Benchmark.bm{|x|
# x.report("yarv"){ YARVUtil.load_bm(file) }
} unless $yarvonly || $rubyonly
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 exec_command type, file, w
<<-EOP
$DRIVER_PATH = '#{File.dirname($0)}'
$LOAD_PATH.replace $LOAD_PATH | #{$LOAD_PATH.inspect}
require 'benchmark'
require 'yarvutil'
print '#{type}'
begin
puts Benchmark.measure{
#{w}('#{file}')
}
rescue Exception => exec_command_error_variable
puts "\t" + exec_command_error_variable.message
end
EOP
end
def benchmark prog
rubybin = ENV['RUBY'] || File.join(
Config::CONFIG["bindir"],
Config::CONFIG["ruby_install_name"] + Config::CONFIG["EXEEXT"])
#
tmpfile = Tempfile.new('yarvbench')
tmpfile.write(prog)
tmpfile.close
cmd = "#{rubybin} #{tmpfile.path}"
result = `#{cmd}`
puts result
tmpfile.close(true)
result
end
def ruby_exec file
prog = exec_command 'ruby', file, 'load'
benchmark prog
end
def yarv_exec file
prog = exec_command 'yarv', file, 'YARVUtil.load_bm'
benchmark prog
end
if $0 == __FILE__
ARGV.each{|arg|
if /\A(--yarv)|(-y)/ =~ arg
$yarvonly = true
elsif /\A(--ruby)|(-r)/ =~ arg
$rubyonly = true
end
}
ARGV.delete_if{|arg|
/\A-/ =~ arg
}
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

129
benchmark/run_rite.rb Normal file
View file

@ -0,0 +1,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

29
benchmark/runc.rb Normal file
View file

@ -0,0 +1,29 @@
#
#
#
require 'benchmark'
require 'rbconfig'
$rubybin = ENV['RUBY'] || File.join(
Config::CONFIG["bindir"],
Config::CONFIG["ruby_install_name"] + Config::CONFIG["EXEEXT"])
def runfile file
puts file
file = File.join(File.dirname($0), 'contrib', file)
Benchmark.bm{|x|
x.report('ruby'){
system("#{$rubybin} #{file}")
}
x.report('yarv'){
system("#{$rubybin} -rite -I.. #{file}")
}
}
end
ARGV.each{|file|
runfile file
}

25
benchmark/wc.input.base Normal file

File diff suppressed because one or more lines are too long