Skip to content

Commit

Permalink
added fannkuch benchmark
Browse files Browse the repository at this point in the history
git-svn-id: http://svn.macosforge.org/repository/ruby/MacRuby/trunk@4475 23306eb0-4c56-4727-a40e-e92c0eb68959
  • Loading branch information
lrz committed Aug 27, 2010
1 parent 0162c98 commit fd7735d
Showing 1 changed file with 62 additions and 0 deletions.
62 changes: 62 additions & 0 deletions perf/misc/fannkuch.rb
@@ -0,0 +1,62 @@
# From The Computer Language Benchmarks Game
# http://shootout.alioth.debian.org/
# Contributed by Wesley Moxam

def fannkuch(n)
sign, maxflips, sum = 1, 0, 0

p = [nil].concat((1..n).to_a)
q = p.dup
s = p.dup

while(true)
# Copy and flip.
q1 = p[1] # Cache 1st element.
if q1 != 1
q = p.dup
flips = 1
while(true)
qq = q[q1]
if qq == 1 # ... until 1st element is 1.
sum = sum + sign * flips
maxflips = flips if flips > maxflips # New maximum?
break
end
q[q1] = q1
if q1 >= 4
i, j = 2, q1 - 1
begin
q[i], q[j] = q[j], q[i]
i = i + 1
j = j - 1
end while i < j
end
q1 = qq
flips = flips + 1
end
end
# Permute.
if sign == 1
# Rotate 1<-2.
p[1], p[2] = p[2], p[1]
sign = -1
else
# Rotate 1<-2 and 1<-2<-3.
p[2], p[3] = p[3], p[2]
sign = 1
3.upto(n) do |i|
(s[i] = s[i] - 1) && break unless s[i] == 1
return [sum, maxflips] if i == n # Out of permutations.
s[i] = i
# Rotate 1<-...<-i+1.
t = p[1]
1.upto(i) do |j|
p[j] = p[j+1]
end
p[i+1] = t
end
end
end
end

perf_test('fannkuch') { fannkuch(9) }

0 comments on commit fd7735d

Please sign in to comment.