[ruby]
# encoding: utf-8
require ‘benchmark’
class Node
@@number = 0
def initialize(attach = nil)
@attach = attach
@fiber = Fiber.new { pass_number }
end
def pass_number
loop do
@attach ? @@number = @attach.resume.succ
: @@number = @@number.succ
Fiber.yield @@number
end
end
def resume
@fiber.resume
end
def reset_number
@@number = 0
end
end
class Gauge
def initialize
@nodes = $*[0].to_i
@cycles = $*[1].to_i
create_ring
end
def create_ring
if @nodes <= 1
raise ArgumentError, ‘the node quantity should be greater than 1’
else
@nodes.times do
@ring ? @ring = Node.new(@ring)
: @ring = Node.new
end
end
end
def run
time = Benchmark.measure do
@cycles.times { @ring.resume }
end.format(‘%.3r’).gsub!(/(|)/, ”)
puts time
@ring.reset_number
end
def self.start
new.run
end
end
Gauge.start
[/ruby]