[macruby-changes] [4158] MacRuby/trunk/perf

source_changes at macosforge.org source_changes at macosforge.org
Tue May 25 20:58:44 PDT 2010


Revision: 4158
          http://trac.macosforge.org/projects/ruby/changeset/4158
Author:   lsansonetti at apple.com
Date:     2010-05-25 20:58:42 -0700 (Tue, 25 May 2010)
Log Message:
-----------
split the algo tests into a misc directory + added sudoku test

Modified Paths:
--------------
    MacRuby/trunk/perf/boot.rb
    MacRuby/trunk/perf/run.rb

Added Paths:
-----------
    MacRuby/trunk/perf/misc/
    MacRuby/trunk/perf/misc/ack.rb
    MacRuby/trunk/perf/misc/ao_bench.rb
    MacRuby/trunk/perf/misc/fib.rb
    MacRuby/trunk/perf/misc/mandelbrot.rb
    MacRuby/trunk/perf/misc/sudoku.rb
    MacRuby/trunk/perf/misc/tak.rb
    MacRuby/trunk/perf/perf_misc.rb

Removed Paths:
-------------
    MacRuby/trunk/perf/perf_algo.rb

Modified: MacRuby/trunk/perf/boot.rb
===================================================================
--- MacRuby/trunk/perf/boot.rb	2010-05-26 02:10:25 UTC (rev 4157)
+++ MacRuby/trunk/perf/boot.rb	2010-05-26 03:58:42 UTC (rev 4158)
@@ -1,14 +1,18 @@
+if ARGV.size < 2 or ARGV.size > 3
+  $stderr.puts "Usage: #{__FILE__} <n-iterations> <file.rb> [suite]"
+  exit 1
+end
+N = ARGV[0].to_i
+file = ARGV[1]
+ at suite = ARGV[2]
 @perf_tests = []
 def perf_test(name, &b)
-  @perf_tests << [name, b]  
+  if @suite == nil or @suite == name
+    @perf_tests << [name, b]
+  end
 end
 
-if ARGV.size != 2
-  $stderr.puts "Usage: #{__FILE__} <n-iterations> <file.rb>"
-  exit 1
-end
-N = ARGV[0].to_i
-load(ARGV[1])
+load(file)
 
 @perf_tests.each do |name, proc|
   times = []

Added: MacRuby/trunk/perf/misc/ack.rb
===================================================================
--- MacRuby/trunk/perf/misc/ack.rb	                        (rev 0)
+++ MacRuby/trunk/perf/misc/ack.rb	2010-05-26 03:58:42 UTC (rev 4158)
@@ -0,0 +1,11 @@
+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
+
+perf_test('ack') { ack(3, 9) }

Added: MacRuby/trunk/perf/misc/ao_bench.rb
===================================================================
--- MacRuby/trunk/perf/misc/ao_bench.rb	                        (rev 0)
+++ MacRuby/trunk/perf/misc/ao_bench.rb	2010-05-26 03:58:42 UTC (rev 4158)
@@ -0,0 +1,288 @@
+module AOBench
+  # AO render benchmark 
+  # Original program (C) Syoyo Fujita in Javascript (and other languages)
+  #      http://lucille.atso-net.jp/blog/?p=642
+  #      http://lucille.atso-net.jp/blog/?p=711
+  # Ruby(yarv2llvm) version by Hideki Miura
+  #      http://github.com/miura1729/yarv2llvm/blob/a888d8ce6855e70b630a8673d4cfe075a8e44f0e/sample/ao-render.rb
+  # Modified by Tomoyuki Chikanaga
+  #
+  
+  IMAGE_WIDTH = 64   # original value: 256
+  IMAGE_HEIGHT = 64  # original value: 256
+  NSUBSAMPLES = 2
+  NAO_SAMPLES = 6    # original value: 8
+  
+  class Vec
+    def initialize(x, y, z)
+      @x = x
+      @y = y
+      @z = z
+    end
+  
+    attr_accessor :x, :y, :z
+  
+    def vadd(b)
+      Vec.new(@x + b.x, @y + b.y, @z + b.z)
+    end
+  
+    def vsub(b)
+      Vec.new(@x - b.x, @y - b.y, @z - b.z)
+    end
+  
+    def vcross(b)
+      Vec.new(@y * b.z - @z * b.y,
+              @z * b.x - @x * b.z,
+              @x * b.y - @y * b.x)
+    end
+  
+    def vdot(b)
+      @x * b.x + @y * b.y + @z * b.z
+    end
+  
+    def vlength
+      Math.sqrt(@x * @x + @y * @y + @z * @z)
+    end
+  
+    def vnormalize!
+      len = vlength
+      if len > 1.0e-17
+        r_len = 1.0 / len
+        @x *= r_len
+        @y *= r_len
+        @z *= r_len
+      end
+      self
+    end
+  end
+  
+  class Sphere
+    def initialize(center, radius)
+      @center = center
+      @radius_2 = radius * radius
+    end
+  
+    def intersect(ray, isect)
+      rs = ray.org.vsub(@center)
+      b = rs.vdot(ray.dir)
+      c = rs.vdot(rs) - @radius_2
+      d = b * b - c
+      if d > 0.0
+        t = - b - Math.sqrt(d)
+  
+        isect.cross(self, ray, t)
+      end
+      nil
+    end
+  
+    def normal_vec(pos)
+      pos.vsub(@center).vnormalize!
+    end
+  end
+  
+  class Plane
+    def initialize(p, n)
+      @p = p
+      @n = n
+    end
+  
+    def intersect(ray, isect)
+      d = - at p.vdot(@n)
+      v = ray.dir.vdot(@n)
+      v0 = v
+      if v < 0.0
+        v0 = -v
+      end
+      if v0 < 1.0e-17
+        return
+      end
+  
+      t = -(ray.org.vdot(@n) + d) / v
+  
+      isect.cross(self, ray, t)
+      nil
+    end
+  
+    def normal_vec(pos)
+      @n
+    end
+  end
+  
+  class Ray
+    def initialize(org, dir)
+      @org = org
+      @dir = dir
+    end
+    attr_reader :org, :dir
+  end
+  
+  class Isect
+    def initialize
+      @t = Float::MAX
+      @hit = false
+      @pl = Vec.new(0.0, 0.0, 0.0)
+      @normal = Vec.new(0.0, 0.0, 0.0)
+    end
+  
+    attr_reader :normal
+  
+    def hit?
+      @hit
+    end
+  
+    def cross(geom, ray, dist)
+      if 0.0 < dist and dist < @t
+        @hit = true
+        @t = dist
+        @pl = Vec.new(ray.org.x + ray.dir.x * dist,
+                      ray.org.y + ray.dir.y * dist,
+                      ray.org.z + ray.dir.z * dist)
+        @normal = geom.normal_vec(@pl)
+      end
+      nil
+    end
+  
+    def surface(eps)
+      Vec.new(@pl.x + eps * @normal.x,
+              @pl.y + eps * @normal.y,
+              @pl.z + eps * @normal.z)
+    end
+  end
+  
+  def self.clamp(f)
+    i = f * 255.5
+    if i > 255.0
+      i = 255.0
+    end
+    if i < 0.0
+      i = 0.0
+    end
+    i.round
+  end
+  
+  def self.otherBasis(basis, n)
+    basis[2] = Vec.new(n.x, n.y, n.z)
+    basis[1] = Vec.new(0.0, 0.0, 0.0)
+    
+    if n.x < 0.6 and n.x > -0.6
+      basis[1].x = 1.0
+    elsif n.y < 0.6 and n.y > -0.6
+      basis[1].y = 1.0
+    elsif n.z < 0.6 and n.z > -0.6
+      basis[1].z = 1.0
+    else
+      basis[1].x = 1.0
+    end
+  
+    basis[0] = basis[1].vcross(basis[2])
+    basis[0].vnormalize!
+  
+    basis[1] = basis[2].vcross(basis[0])
+    basis[1].vnormalize!
+  end
+  
+  class Scene
+    def initialize
+      @spheres = Array.new
+      @spheres[0] = Sphere.new(Vec.new(-2.0, 0.0, -3.5), 0.5)
+      @spheres[1] = Sphere.new(Vec.new(-0.5, 0.0, -3.0), 0.5)
+      @spheres[2] = Sphere.new(Vec.new(1.0, 0.0, -2.2), 0.5)
+      @plane = Plane.new(Vec.new(0.0, -0.5, 0.0), Vec.new(0.0, 1.0, 0.0))
+    end
+  
+    def ambient_occlusion(isect)
+      basis = Array.new
+      AOBench.otherBasis(basis, isect.normal)
+  
+      ntheta    = NAO_SAMPLES
+      nphi      = NAO_SAMPLES
+      eps       = 0.0001
+      occlusion = 0.0
+  
+      p0 = isect.surface(eps)
+      nphi.times do |j|
+        ntheta.times do |i|
+          r = rand
+          rr = Math.sqrt(1.0 - r)
+          phi = 2.0 * Math::PI * rand
+          x = Math.cos(phi) * rr
+          y = Math.sin(phi) * rr
+          z = Math.sqrt(r)
+  
+          rx = x * basis[0].x + y * basis[1].x + z * basis[2].x
+          ry = x * basis[0].y + y * basis[1].y + z * basis[2].y
+          rz = x * basis[0].z + y * basis[1].z + z * basis[2].z
+  
+          raydir = Vec.new(rx, ry, rz)
+          ray = Ray.new(p0, raydir)
+  
+          occisect = Isect.new
+          @spheres[0].intersect(ray, occisect)
+          @spheres[1].intersect(ray, occisect)
+          @spheres[2].intersect(ray, occisect)
+          @plane.intersect(ray, occisect)
+          if occisect.hit?
+            occlusion = occlusion + 1.0
+          else
+            0.0
+          end
+        end
+      end
+  
+      occlusion = (ntheta * nphi - occlusion).to_f / (ntheta * nphi)
+  
+      occlusion
+    end
+  
+    def render(w, h, nsubsamples)
+      cnt = 0
+      pixbuf = []
+      nsf = nsubsamples.to_f
+      nsf_2 = nsf * nsf
+      h.times do |y|
+        w.times do |x|
+          rad = 0.0
+  
+          # Subsmpling
+          nsubsamples.times do |v|
+            nsubsamples.times do |u|
+  
+              cnt = cnt + 1
+              wf = w.to_f
+              hf = h.to_f
+              xf = x.to_f
+              yf = y.to_f
+              uf = u.to_f
+              vf = v.to_f
+  
+              px = (xf + (uf / nsf) - (wf / 2.0)) / (wf / 2.0)
+              py = -(yf + (vf / nsf) - (hf / 2.0)) / (hf / 2.0)
+  
+              eye = Vec.new(px, py, -1.0)
+              eye.vnormalize!
+  
+              ray = Ray.new(Vec.new(0.0, 0.0, 0.0), eye)
+  
+              isect = Isect.new
+              @spheres[0].intersect(ray, isect)
+              @spheres[1].intersect(ray, isect)
+              @spheres[2].intersect(ray, isect)
+              @plane.intersect(ray, isect)
+              if isect.hit?
+                rad += ambient_occlusion(isect)
+              end
+            end
+          end
+  
+          pixbuf << AOBench.clamp(rad / nsf_2)
+        end
+      end
+    end
+  end
+
+  def self.test
+    Scene.new.render(IMAGE_WIDTH, IMAGE_HEIGHT, NSUBSAMPLES)
+  end
+end
+
+perf_test('ao_bench') { AOBench.test }

Added: MacRuby/trunk/perf/misc/fib.rb
===================================================================
--- MacRuby/trunk/perf/misc/fib.rb	                        (rev 0)
+++ MacRuby/trunk/perf/misc/fib.rb	2010-05-26 03:58:42 UTC (rev 4158)
@@ -0,0 +1,9 @@
+def fib(n)
+  if n < 3
+    1
+  else
+    fib(n - 1) + fib(n - 2)
+  end
+end
+
+perf_test('fib') { fib(37) }

Added: MacRuby/trunk/perf/misc/mandelbrot.rb
===================================================================
--- MacRuby/trunk/perf/misc/mandelbrot.rb	                        (rev 0)
+++ MacRuby/trunk/perf/misc/mandelbrot.rb	2010-05-26 03:58:42 UTC (rev 4158)
@@ -0,0 +1,32 @@
+def mandelbrot_i(x, y)
+  cr = y - 0.5
+  ci = x
+  zi = 0.0
+  zr = 0.0
+  i = 0
+
+  while true
+    i += 1
+    temp = zr * zi
+    zr2 = zr * zr
+    zi2 = zi * zi
+    zr = zr2 - zi2 + cr
+    zi = temp + temp + ci
+    return i if (zi2 + zr2 > 16)
+    return 0 if (i > 1000)
+  end
+end
+
+def mandelbrot
+  y = -39
+  while y < 39
+    x = -39
+    while x < 39
+      i = mandelbrot_i(x / 40.0, y/40.0)
+      x += 1
+    end
+    y += 1
+  end
+end
+
+perf_test('mandelbrot') { mandelbrot }

Added: MacRuby/trunk/perf/misc/sudoku.rb
===================================================================
--- MacRuby/trunk/perf/misc/sudoku.rb	                        (rev 0)
+++ MacRuby/trunk/perf/misc/sudoku.rb	2010-05-26 03:58:42 UTC (rev 4158)
@@ -0,0 +1,62 @@
+class Sudoku
+  # Sudoku solver
+  # from http://blog.mmediasys.com/2008/04/24/contributions-speedup-and-less-quirks-for-us/
+  
+  def valid?(state, x, y)
+    # check in col and row
+    0.upto(8) do |i|
+      return false if i != y and state[x][i] == state[x][y]
+      return false if i != x and state[i][y] == state[x][y]
+    end
+  
+    # check in box
+    x_from = (x / 3) * 3
+    y_from = (y / 3) * 3
+    x_from.upto(x_from + 2) do |xx|
+      y_from.upto(y_from + 2) do |yy|
+        return false if (xx != x or yy != y) and state[xx][yy] == state[x][y]
+      end
+    end
+  
+    true
+  end
+  
+  
+  def next_state(state, x, y)
+    @count = @count + 1
+    y = 0 and x = x + 1 if y == 9
+    return true if x == 9
+  
+    unless state[x][y].zero?
+      return false unless valid?(state, x, y)
+      return next_state(state, x, y + 1)
+    else
+      1.upto(9) do |i|
+        state[x][y] = i
+        return true if valid?(state, x, y) and next_state(state, x, y + 1)
+      end
+    end
+  
+    state[x][y] = 0
+    false
+  end
+
+  def test
+    @count = 0
+    start =
+      [
+        [ 0, 0, 0, 4, 0, 5, 0, 0, 1 ],
+        [ 0, 7, 0, 0, 0, 0, 0, 3, 0 ],
+        [ 0, 0, 4, 0, 0, 0, 9, 0, 0 ],
+        [ 0, 0, 3, 5, 0, 4, 1, 0, 0 ],
+        [ 0, 0, 7, 0, 0, 0, 4, 0, 0 ],
+        [ 0, 0, 8, 9, 0, 1, 0, 0, 0 ],
+        [ 0, 0, 9, 0, 0, 0, 6, 0, 0 ],
+        [ 0, 8, 0, 0, 0, 0, 0, 2, 0 ],
+        [ 4, 0, 0, 2, 0, 0, 0, 0, 0 ]
+      ]
+    next_state(start, 0, 0)
+  end
+end
+
+perf_test('sudoku') { Sudoku.new.test }

Added: MacRuby/trunk/perf/misc/tak.rb
===================================================================
--- MacRuby/trunk/perf/misc/tak.rb	                        (rev 0)
+++ MacRuby/trunk/perf/misc/tak.rb	2010-05-26 03:58:42 UTC (rev 4158)
@@ -0,0 +1,11 @@
+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
+
+perf_test('tak') { tak(18, 9, 0) }

Deleted: MacRuby/trunk/perf/perf_algo.rb
===================================================================
--- MacRuby/trunk/perf/perf_algo.rb	2010-05-26 02:10:25 UTC (rev 4157)
+++ MacRuby/trunk/perf/perf_algo.rb	2010-05-26 03:58:42 UTC (rev 4158)
@@ -1,355 +0,0 @@
-def fib(n)
-  if n < 3
-    1
-  else
-    fib(n - 1) + fib(n - 2)
-  end
-end
-
-perf_test('fib') { fib(37) }
-
-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
-
-perf_test('tak') { tak(18, 9, 0) }
-
-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
-
-perf_test('ack') { ack(3, 9) }
-
-def mandelbrot_i(x, y)
-  cr = y - 0.5
-  ci = x
-  zi = 0.0
-  zr = 0.0
-  i = 0
-
-  while true
-    i += 1
-    temp = zr * zi
-    zr2 = zr * zr
-    zi2 = zi * zi
-    zr = zr2 - zi2 + cr
-    zi = temp + temp + ci
-    return i if (zi2 + zr2 > 16)
-    return 0 if (i > 1000)
-  end
-end
-
-def mandelbrot
-  y = -39
-  while y < 39
-    x = -39
-    while x < 39
-      i = mandelbrot_i(x / 40.0, y/40.0)
-      x += 1
-    end
-    y += 1
-  end
-end
-
-perf_test('mandelbrot') { mandelbrot }
-
-module AOBench
-  # AO render benchmark 
-  # Original program (C) Syoyo Fujita in Javascript (and other languages)
-  #      http://lucille.atso-net.jp/blog/?p=642
-  #      http://lucille.atso-net.jp/blog/?p=711
-  # Ruby(yarv2llvm) version by Hideki Miura
-  #      http://github.com/miura1729/yarv2llvm/blob/a888d8ce6855e70b630a8673d4cfe075a8e44f0e/sample/ao-render.rb
-  # Modified by Tomoyuki Chikanaga
-  #
-  
-  IMAGE_WIDTH = 64   # original value: 256
-  IMAGE_HEIGHT = 64  # original value: 256
-  NSUBSAMPLES = 2
-  NAO_SAMPLES = 6    # original value: 8
-  
-  class Vec
-    def initialize(x, y, z)
-      @x = x
-      @y = y
-      @z = z
-    end
-  
-    attr_accessor :x, :y, :z
-  
-    def vadd(b)
-      Vec.new(@x + b.x, @y + b.y, @z + b.z)
-    end
-  
-    def vsub(b)
-      Vec.new(@x - b.x, @y - b.y, @z - b.z)
-    end
-  
-    def vcross(b)
-      Vec.new(@y * b.z - @z * b.y,
-              @z * b.x - @x * b.z,
-              @x * b.y - @y * b.x)
-    end
-  
-    def vdot(b)
-      @x * b.x + @y * b.y + @z * b.z
-    end
-  
-    def vlength
-      Math.sqrt(@x * @x + @y * @y + @z * @z)
-    end
-  
-    def vnormalize!
-      len = vlength
-      if len > 1.0e-17
-        r_len = 1.0 / len
-        @x *= r_len
-        @y *= r_len
-        @z *= r_len
-      end
-      self
-    end
-  end
-  
-  class Sphere
-    def initialize(center, radius)
-      @center = center
-      @radius_2 = radius * radius
-    end
-  
-    def intersect(ray, isect)
-      rs = ray.org.vsub(@center)
-      b = rs.vdot(ray.dir)
-      c = rs.vdot(rs) - @radius_2
-      d = b * b - c
-      if d > 0.0
-        t = - b - Math.sqrt(d)
-  
-        isect.cross(self, ray, t)
-      end
-      nil
-    end
-  
-    def normal_vec(pos)
-      pos.vsub(@center).vnormalize!
-    end
-  end
-  
-  class Plane
-    def initialize(p, n)
-      @p = p
-      @n = n
-    end
-  
-    def intersect(ray, isect)
-      d = - at p.vdot(@n)
-      v = ray.dir.vdot(@n)
-      v0 = v
-      if v < 0.0
-        v0 = -v
-      end
-      if v0 < 1.0e-17
-        return
-      end
-  
-      t = -(ray.org.vdot(@n) + d) / v
-  
-      isect.cross(self, ray, t)
-      nil
-    end
-  
-    def normal_vec(pos)
-      @n
-    end
-  end
-  
-  class Ray
-    def initialize(org, dir)
-      @org = org
-      @dir = dir
-    end
-    attr_reader :org, :dir
-  end
-  
-  class Isect
-    def initialize
-      @t = Float::MAX
-      @hit = false
-      @pl = Vec.new(0.0, 0.0, 0.0)
-      @normal = Vec.new(0.0, 0.0, 0.0)
-    end
-  
-    attr_reader :normal
-  
-    def hit?
-      @hit
-    end
-  
-    def cross(geom, ray, dist)
-      if 0.0 < dist and dist < @t
-        @hit = true
-        @t = dist
-        @pl = Vec.new(ray.org.x + ray.dir.x * dist,
-                      ray.org.y + ray.dir.y * dist,
-                      ray.org.z + ray.dir.z * dist)
-        @normal = geom.normal_vec(@pl)
-      end
-      nil
-    end
-  
-    def surface(eps)
-      Vec.new(@pl.x + eps * @normal.x,
-              @pl.y + eps * @normal.y,
-              @pl.z + eps * @normal.z)
-    end
-  end
-  
-  def self.clamp(f)
-    i = f * 255.5
-    if i > 255.0
-      i = 255.0
-    end
-    if i < 0.0
-      i = 0.0
-    end
-    i.round
-  end
-  
-  def self.otherBasis(basis, n)
-    basis[2] = Vec.new(n.x, n.y, n.z)
-    basis[1] = Vec.new(0.0, 0.0, 0.0)
-    
-    if n.x < 0.6 and n.x > -0.6
-      basis[1].x = 1.0
-    elsif n.y < 0.6 and n.y > -0.6
-      basis[1].y = 1.0
-    elsif n.z < 0.6 and n.z > -0.6
-      basis[1].z = 1.0
-    else
-      basis[1].x = 1.0
-    end
-  
-    basis[0] = basis[1].vcross(basis[2])
-    basis[0].vnormalize!
-  
-    basis[1] = basis[2].vcross(basis[0])
-    basis[1].vnormalize!
-  end
-  
-  class Scene
-    def initialize
-      @spheres = Array.new
-      @spheres[0] = Sphere.new(Vec.new(-2.0, 0.0, -3.5), 0.5)
-      @spheres[1] = Sphere.new(Vec.new(-0.5, 0.0, -3.0), 0.5)
-      @spheres[2] = Sphere.new(Vec.new(1.0, 0.0, -2.2), 0.5)
-      @plane = Plane.new(Vec.new(0.0, -0.5, 0.0), Vec.new(0.0, 1.0, 0.0))
-    end
-  
-    def ambient_occlusion(isect)
-      basis = Array.new
-      AOBench.otherBasis(basis, isect.normal)
-  
-      ntheta    = NAO_SAMPLES
-      nphi      = NAO_SAMPLES
-      eps       = 0.0001
-      occlusion = 0.0
-  
-      p0 = isect.surface(eps)
-      nphi.times do |j|
-        ntheta.times do |i|
-          r = rand
-          rr = Math.sqrt(1.0 - r)
-          phi = 2.0 * Math::PI * rand
-          x = Math.cos(phi) * rr
-          y = Math.sin(phi) * rr
-          z = Math.sqrt(r)
-  
-          rx = x * basis[0].x + y * basis[1].x + z * basis[2].x
-          ry = x * basis[0].y + y * basis[1].y + z * basis[2].y
-          rz = x * basis[0].z + y * basis[1].z + z * basis[2].z
-  
-          raydir = Vec.new(rx, ry, rz)
-          ray = Ray.new(p0, raydir)
-  
-          occisect = Isect.new
-          @spheres[0].intersect(ray, occisect)
-          @spheres[1].intersect(ray, occisect)
-          @spheres[2].intersect(ray, occisect)
-          @plane.intersect(ray, occisect)
-          if occisect.hit?
-            occlusion = occlusion + 1.0
-          else
-            0.0
-          end
-        end
-      end
-  
-      occlusion = (ntheta * nphi - occlusion).to_f / (ntheta * nphi)
-  
-      occlusion
-    end
-  
-    def render(w, h, nsubsamples)
-      cnt = 0
-      pixbuf = []
-      nsf = nsubsamples.to_f
-      nsf_2 = nsf * nsf
-      h.times do |y|
-        w.times do |x|
-          rad = 0.0
-  
-          # Subsmpling
-          nsubsamples.times do |v|
-            nsubsamples.times do |u|
-  
-              cnt = cnt + 1
-              wf = w.to_f
-              hf = h.to_f
-              xf = x.to_f
-              yf = y.to_f
-              uf = u.to_f
-              vf = v.to_f
-  
-              px = (xf + (uf / nsf) - (wf / 2.0)) / (wf / 2.0)
-              py = -(yf + (vf / nsf) - (hf / 2.0)) / (hf / 2.0)
-  
-              eye = Vec.new(px, py, -1.0)
-              eye.vnormalize!
-  
-              ray = Ray.new(Vec.new(0.0, 0.0, 0.0), eye)
-  
-              isect = Isect.new
-              @spheres[0].intersect(ray, isect)
-              @spheres[1].intersect(ray, isect)
-              @spheres[2].intersect(ray, isect)
-              @plane.intersect(ray, isect)
-              if isect.hit?
-                rad += ambient_occlusion(isect)
-              end
-            end
-          end
-  
-          pixbuf << AOBench.clamp(rad / nsf_2)
-        end
-      end
-    end
-  end
-
-  def self.test
-    Scene.new.render(IMAGE_WIDTH, IMAGE_HEIGHT, NSUBSAMPLES)
-  end
-end
-
-perf_test('ao_bench') { AOBench.test }

Added: MacRuby/trunk/perf/perf_misc.rb
===================================================================
--- MacRuby/trunk/perf/perf_misc.rb	                        (rev 0)
+++ MacRuby/trunk/perf/perf_misc.rb	2010-05-26 03:58:42 UTC (rev 4158)
@@ -0,0 +1 @@
+Dir.glob(File.join(File.dirname(__FILE__), "misc/*.rb")).each { |x| load x }

Modified: MacRuby/trunk/perf/run.rb
===================================================================
--- MacRuby/trunk/perf/run.rb	2010-05-26 02:10:25 UTC (rev 4157)
+++ MacRuby/trunk/perf/run.rb	2010-05-26 03:58:42 UTC (rev 4158)
@@ -14,12 +14,13 @@
       exit 1
     end
   else
-    perf_files << File.join(cwd, "perf_#{arg}.rb")
+    name, suite = arg.split(':', 2)
+    perf_files << [File.join(cwd, "perf_#{name}.rb"), suite]
   end
 end
 
 if perf_files.empty?
-  perf_files = Dir.glob(File.join(cwd, 'perf_*.rb'))
+  perf_files = Dir.glob(File.join(cwd, 'perf_*.rb')).map { |x| [x, nil] }
 end
 
 if rubies.empty?
@@ -35,10 +36,11 @@
 puts '', '-' * 80
 
 booter = File.join(cwd, 'boot.rb')
-perf_files.each do |file|
+perf_files.each do |file, suite|
   results = {}
+  suite ||= ''
   rubies.each do |ruby| 
-    output = `#{ruby} #{booter} #{n_iterations} #{file}`.strip
+    output = `#{ruby} #{booter} #{n_iterations} #{file} #{suite}`.strip
     output.split(/\n/).each do |line|
       title, times = line.split(/:/)
       best = times.split(/,/).min
@@ -49,7 +51,10 @@
   prefix = File.basename(file).scan(/perf_(\w+)\.rb/)[0][0]
   results.each do |title, res|
     print "#{prefix}:#{title}".ljust(20)
-    winner = res.size > 1 ? res.map { |_, best| best }.min : nil
+    winner = nil
+    if res.size > 1
+      winner = res.map { |_, best| best.to_f }.min.to_s  
+    end
     res.each do |_, best|
       s = best.ljust(20)
       if best == winner
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100525/55cab10d/attachment-0001.html>


More information about the macruby-changes mailing list