Skip to content

Instantly share code, notes, and snippets.

@soveran

soveran/fsm.rb Secret

Created April 2, 2012 20:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save soveran/228f7365c17596896285 to your computer and use it in GitHub Desktop.
Save soveran/228f7365c17596896285 to your computer and use it in GitHub Desktop.
Comparison between state_machine and micromachine.
require "state_machine"
require "micromachine"
require "benchmark"
module SM
class Vehicle
state_machine :alarm_state, :initial => :active, :namespace => "alarm" do
event :enable do
transition all => :active
end
event :disable do
transition all => :off
end
state :active, :value => 1
state :off, :value => 0
end
end
end
module MM
class Vehicle
attr :alarm_state
def initialize
@alarm_state = 1
end
def alarm
@alarm ||= begin
MicroMachine.new(:active).tap do |fsm|
# Transitions.
fsm.when(:enable, :off => :active)
fsm.when(:disable, :active => :off)
# Callbacks.
fsm.on(:active) { @alarm_state = 1 }
fsm.on(:off) { @alarm_state = 0 }
end
end
end
def alarm_state_name
alarm.state
end
def can_disable_alarm?
alarm.trigger?(:disable)
end
def disable_alarm
alarm.trigger(:disable)
end
end
end
scope do
test "state_machine" do
vehicle = SM::Vehicle.new
assert_equal 1, vehicle.alarm_state
assert_equal :active, vehicle.alarm_state_name
assert_equal true, vehicle.can_disable_alarm?
end
test "micromachine" do
vehicle = MM::Vehicle.new
assert_equal 1, vehicle.alarm_state
assert_equal :active, vehicle.alarm_state_name
assert_equal true, vehicle.can_disable_alarm?
end
end
puts
Benchmark.bm(14) do |bm|
bm.report("state_machine:") do
10000.times do
vehicle = SM::Vehicle.new
vehicle.alarm_state
vehicle.alarm_state_name
vehicle.can_disable_alarm?
vehicle.disable_alarm
end
end
bm.report("micromachine:") do
10000.times do
vehicle = MM::Vehicle.new
vehicle.alarm_state
vehicle.alarm_state_name
vehicle.can_disable_alarm?
vehicle.disable_alarm
end
end
end
# :!cutest fsm.rb
# ......
# user system total real
# state_machine: 2.820000 0.000000 2.820000 ( 2.824512)
# micromachine: 0.260000 0.000000 0.260000 ( 0.269632)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment