Skip to content

Instantly share code, notes, and snippets.

@tomfakes tomfakes/fizzbuzz.rb
Created Aug 28, 2019

Embed
What would you like to do?
Benchmark of different FizzBuzz implementations in Ruby
require "benchmark/ips"
#####
def fizz_buzz_text(num)
result = ''
result += 'Fizz' if (num % 3).zero?
result += 'Buzz' if (num % 5).zero?
result.empty? ? num.to_s : result
end
#####
def fizz_buzz_array(num)
result = []
result << 'Fizz' if (num % 3).zero?
result << 'Buzz' if (num % 5).zero?
result.empty? ? num.to_s : result.join
end
#####
def fizz_buzz_if_else(num)
if (num % 15) == 0
"FizzBuzz"
elsif (num % 5) == 0
"Fizz"
elsif (num % 3) == 0
"Buzz"
else
num.to_s
end
end
#####
def fizz_buzz_if_return(num)
return "FizzBuzz" if (num % 15) == 0
return "Fizz" if (num % 5) == 0
return "Buzz" if (num % 3) == 0
num.to_s
end
#####
def fizz_buzz_if_frozen(num)
if (num % 15) == 0
"FizzBuzz".freeze
elsif (num % 5) == 0
"Fizz".freeze
elsif (num % 3) == 0
"Buzz".freeze
else
num.to_s
end
end
#####
def fizz_buzz_if_frozen_zero(num)
if (num % 15).zero?
"FizzBuzz".freeze
elsif (num % 5).zero?
"Fizz".freeze
elsif (num % 3).zero?
"Buzz".freeze
else
num.to_s
end
end
#####
Divisable_by_fifteen = Proc.new { |i| i % 15 == 0 }
Divisable_by_three = Proc.new { |i| i % 3 == 0 }
Divisable_by_five = Proc.new { |i| i % 5 == 0 }
def fizz_buzz_case(num)
case num
when Divisable_by_fifteen
"FizzBuzz"
when Divisable_by_five
"Fizz"
when Divisable_by_three
"Buzz"
else
num.to_s
end
end
##### Cached
VALUES = []
def create_cache(max = 100)
1.upto(max).each { |i| VALUES[i] = fizz_buzz_if_frozen(i) }
end
def fizz_buzz_cached(num)
VALUES[num]
end
create_cache 100
def fizz_buzz_cached_100
(1..100).each { |x| fizz_buzz_cached x }
end
Benchmark.ips do |x|
x.config(:time => 5, :warmup => 2)
x.report("case") do |times|
i = 0
while i < times
(1..100).each { |x| fizz_buzz_case x }
i += 1
end
end
x.report("if - else") do |times|
i = 0
while i < times
(1..100).each { |x| fizz_buzz_if_else x }
i += 1
end
end
x.report("if - return") do |times|
i = 0
while i < times
(1..100).each { |x| fizz_buzz_if_return x }
i += 1
end
end
x.report("if - frozen") do |times|
i = 0
while i < times
(1..100).each { |x| fizz_buzz_if_frozen x }
i += 1
end
end
x.report("if - frozen - zero") do |times|
i = 0
while i < times
(1..100).each { |x| fizz_buzz_if_frozen_zero x }
i += 1
end
end
x.report("text") do |times|
i = 0
while i < times
(1..100).each { |x| fizz_buzz_text x }
i += 1
end
end
x.report("array") do |times|
i = 0
while i < times
(1..100).each { |x| fizz_buzz_array x }
i += 1
end
end
x.report("cached") do |times|
i = 0
while i < times
(1..100).each { |x| fizz_buzz_cached x }
i += 1
end
end
x.compare!
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.