Skip to content

Instantly share code, notes, and snippets.

@jaynetics
Created December 30, 2022 09:22
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 jaynetics/b775f2248b575529c382af337debffa3 to your computer and use it in GitHub Desktop.
Save jaynetics/b775f2248b575529c382af337debffa3 to your computer and use it in GitHub Desktop.
Benchmark for Ruby case statement vs ==, eql?, equal?
# results on ruby 3.2:
#
# case 7.890M (± 0.9%) i/s - 40.048M in 5.076164s
# == 3.403M (± 0.7%) i/s - 17.121M in 5.031140s
# eql? 1.776M (± 1.2%) i/s - 9.001M in 5.070102s
# equal? 1.791M (± 0.3%) i/s - 8.968M in 5.007507s
require 'benchmark/ips'
def with_case(arg)
case arg
when :a; :a
when :b; :b
when :c; :c
when :d; :d
when :e; :e
when :f; :f
when :g; :g
when :h; :h
when :i; :i
when :j; :j
when :k; :k
when :l; :l
when :m; :m
when :n; :n
when :o; :o
when :p; :p
when :q; :q
when :r; :r
when :s; :s
when :t; :t
when :u; :u
when :v; :v
when :w; :w
when :x; :x
when :y; :y
else :z
end
end
def with_sym_eq(arg)
if arg == :a; :a
elsif arg == :b; :b
elsif arg == :c; :c
elsif arg == :d; :d
elsif arg == :e; :e
elsif arg == :f; :f
elsif arg == :g; :g
elsif arg == :h; :h
elsif arg == :i; :i
elsif arg == :j; :j
elsif arg == :k; :k
elsif arg == :l; :l
elsif arg == :m; :m
elsif arg == :n; :n
elsif arg == :o; :o
elsif arg == :p; :p
elsif arg == :q; :q
elsif arg == :r; :r
elsif arg == :s; :s
elsif arg == :t; :t
elsif arg == :u; :u
elsif arg == :v; :v
elsif arg == :w; :w
elsif arg == :x; :x
elsif arg == :y; :y
else :z
end
end
def with_eql?(arg)
if arg.eql?(:a); :a
elsif arg.eql?(:b); :b
elsif arg.eql?(:c); :c
elsif arg.eql?(:d); :d
elsif arg.eql?(:e); :e
elsif arg.eql?(:f); :f
elsif arg.eql?(:g); :g
elsif arg.eql?(:h); :h
elsif arg.eql?(:i); :i
elsif arg.eql?(:j); :j
elsif arg.eql?(:k); :k
elsif arg.eql?(:l); :l
elsif arg.eql?(:m); :m
elsif arg.eql?(:n); :n
elsif arg.eql?(:o); :o
elsif arg.eql?(:p); :p
elsif arg.eql?(:q); :q
elsif arg.eql?(:r); :r
elsif arg.eql?(:s); :s
elsif arg.eql?(:t); :t
elsif arg.eql?(:u); :u
elsif arg.eql?(:v); :v
elsif arg.eql?(:w); :w
elsif arg.eql?(:x); :x
elsif arg.eql?(:y); :y
else :z
end
end
def with_equal?(arg)
if arg.equal?(:a); :a
elsif arg.equal?(:b); :b
elsif arg.equal?(:c); :c
elsif arg.equal?(:d); :d
elsif arg.equal?(:e); :e
elsif arg.equal?(:f); :f
elsif arg.equal?(:g); :g
elsif arg.equal?(:h); :h
elsif arg.equal?(:i); :i
elsif arg.equal?(:j); :j
elsif arg.equal?(:k); :k
elsif arg.equal?(:l); :l
elsif arg.equal?(:m); :m
elsif arg.equal?(:n); :n
elsif arg.equal?(:o); :o
elsif arg.equal?(:p); :p
elsif arg.equal?(:q); :q
elsif arg.equal?(:r); :r
elsif arg.equal?(:s); :s
elsif arg.equal?(:t); :t
elsif arg.equal?(:u); :u
elsif arg.equal?(:v); :v
elsif arg.equal?(:w); :w
elsif arg.equal?(:x); :x
elsif arg.equal?(:y); :y
else :z
end
end
report = Benchmark.ips do |x|
x.report('case') { with_case(:a); with_case(:m); with_case(:z) }
x.report('==') { with_sym_eq(:a); with_sym_eq(:m); with_sym_eq(:z) }
x.report('eql?') { with_eql?(:a); with_eql?(:m); with_eql?(:z) }
x.report('equal?') { with_equal?(:a); with_equal?(:m); with_equal?(:z) }
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment