[macruby-changes] [3482] MacRuby/trunk/sample-macruby/Scripts/gcd/ring_buffer.rb

source_changes at macosforge.org source_changes at macosforge.org
Wed Feb 10 16:15:17 PST 2010


Revision: 3482
          http://trac.macosforge.org/projects/ruby/changeset/3482
Author:   ernest.prabhakar at gmail.com
Date:     2010-02-10 16:15:16 -0800 (Wed, 10 Feb 2010)
Log Message:
-----------
Redo ring_buffer sample with GCD

Modified Paths:
--------------
    MacRuby/trunk/sample-macruby/Scripts/gcd/ring_buffer.rb

Modified: MacRuby/trunk/sample-macruby/Scripts/gcd/ring_buffer.rb
===================================================================
--- MacRuby/trunk/sample-macruby/Scripts/gcd/ring_buffer.rb	2010-02-11 00:14:49 UTC (rev 3481)
+++ MacRuby/trunk/sample-macruby/Scripts/gcd/ring_buffer.rb	2010-02-11 00:15:16 UTC (rev 3482)
@@ -1,37 +1,49 @@
-#!/usr/bin/env ruby
+#!/usr/local/bin/macruby
+# Ruby Fiber Ring Benchmark
+# Adapted for GCD from: http://people.equars.com/2008/5/22/ruby-fiber-ring-benchmark
 
-N_NODES = ARGV[0] || 4
-M_MESSAGES = ARGV[1] || 3
+require 'benchmark'
+require 'dispatch'
 
+DEBUG = true
+
+N_NODES = DEBUG ? 1 : 3
+M_MESSAGES = DEBUG ? 0 : 3
+
 class Node
     attr_accessor :successor
-    attr :index
-    def initialize(index, successor)
+    attr_reader :index
+    def initialize(g, index, successor)
+        @queue = Dispatch.queue_for(self)
+        @group = g
         @index = index
         @successor = successor
         @current = 0
     end
             
     def call(m)
-        case m
-        when 0
-            return
-        when @current
-            call(m-1)
-        else 
-            puts "#{self}.call #{m}"
-            @current = m
-            @successor.call(m)
+        @queue.async(@group) do
+            case m
+            when 0
+                return
+            when @current
+                call(m-1)
+            else 
+                puts "\t#{self}.call(#{m})" if DEBUG
+                @current = m
+                @successor.call(m)
+            end
         end
     end
     
     def to_s
-        "#{@index}->[#{@successor.index}]@#{@current}"
+        "##{@index}->[#{@successor.index}]@#{@current}"
     end
 end
 
 class Ring
     def initialize(n)
+        @group = Dispatch::Group.new
         @nodes = []
         setup(n)
     end
@@ -39,25 +51,44 @@
     def setup(n)
         last = nil
         n.downto(1) do |i|
-            @nodes << Node.new(i, last)
+            @nodes << Node.new(@group, i, last)
             last = @nodes[-1]
         end
         @nodes[0].successor = last
     end
     
     def call(m)
-        @nodes[0].call(m)
+        @nodes[-1].call(m)
+        @group.wait
     end
     
     def to_s
-        @nodes.join " | "
+        @nodes.reverse.join " | "
     end
 end
 
-1.upto N_NODES do |n|
+def bench(n,m)
+  tm  = Benchmark.measure {
+     yield
+  }.format("%8.6r\n").gsub!(/\(|\)/, "")
+
+  puts "#{n}, #{m}, #{tm}"
+  
+end
+
+0.upto N_NODES do |p|
+    n = 10**p
     ring = Ring.new n
-    puts "\nRing of size #{n}: #{ring}"
-    1.upto(M_MESSAGES) { |m|  puts "m=#{m}"; ring.call m }
+    puts "\nRing of size #{n}:"
+    puts "\t#{ring}" if DEBUG
+    0.upto(M_MESSAGES) do |q|
+      r = 10**q
+      [r, 2*r, 5*r].each do |m|
+          puts "#{m} message(s)" if DEBUG
+        bench(n,m) { ring.call m }
+      end
+    end
 end
+
         
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100210/b8b41b07/attachment-0001.html>


More information about the macruby-changes mailing list