Skip to content

Instantly share code, notes, and snippets.

@pjambet
Last active October 5, 2020 19:18
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 pjambet/c76c69358a0adb05761f1110ce82a9e2 to your computer and use it in GitHub Desktop.
Save pjambet/c76c69358a0adb05761f1110ce82a9e2 to your computer and use it in GitHub Desktop.
require 'benchmark'
require 'securerandom'
require_relative './dict'
RANDOM_BYTES = SecureRandom.bytes(16)
class MyHash
def initialize(pairs)
if pairs.length == 1
@hash = MyHash1.new(pairs[0])
elsif pairs.length == 2
@hash = MyHash2.new(pairs[0], pairs[1])
elsif pairs.length == 3
@hash = MyHash3.new(pairs[0], pairs[1], pairs[2])
elsif pairs.length == 4
@hash = MyHash4.new(pairs[0], pairs[1], pairs[2], pairs[3])
else
raise 'Too big'
end
end
def get(key)
@hash.get(key)
end
end
class MyHash1
def initialize(pair)
@key = pair[0]
@value = pair[1]
end
def get(key)
if @key == key
@value
else
nil
end
end
end
class MyHash2
def initialize(pair1, pair2)
@key1 = pair1[0]
@value1 = pair1[1]
@key2 = pair2[0]
@value2 = pair2[1]
end
def get(key)
if @key1 == key
@value1
elsif @key2 == key
@value2
else
nil
end
end
end
class MyHash3
def initialize(pair1, pair2, pair3)
@key1 = pair1[0]
@value1 = pair1[1]
@key2 = pair2[0]
@value2 = pair2[1]
@key3 = pair3[0]
@value3 = pair3[1]
end
def get(key)
if @key1 == key
@value1
elsif @key2 == key
@value2
elsif @key3 == key
@value3
else
nil
end
end
end
class MyHash4
def initialize(pair1, pair2, pair3, pair4)
@key1 = pair1[0]
@value1 = pair1[1]
@key2 = pair2[0]
@value2 = pair2[1]
@key3 = pair3[0]
@value3 = pair3[1]
@key4 = pair4[0]
@value4 = pair4[1]
end
def get(key)
if @key1 == key
@value1
elsif @key2 == key
@value2
elsif @key3 == key
@value3
elsif @key4 == key
@value4
else
nil
end
end
end
def setup_hash(size)
dict = Hash.new
size.times { |i| dict[i.to_s] = i.to_s }
dict
end
def hash_exp(dict, n, size)
n.times do
r = rand size
dict[r.to_s]
end
end
def setup_dict(size)
dict = BYORedis::Dict.new
size.times { |i| dict[i.to_s] = i.to_s }
dict
end
def dict_exp(dict, n, size)
n.times do
r = rand size
dict[r.to_s]
end
end
def setup_arr(size)
arr = []
size.times { |i| arr << [ i.to_s, i.to_s ] }
arr
end
def array_exp(arr, n, size)
n.times do
r = rand size
arr.each { |a| break if a[0] == r.to_s }
end
end
def setup_my_hash(size)
elements = size.times.map { |i| [ i.to_s, i.to_s ] }
my_hash = MyHash.new(elements)
end
def my_hash_exp(hash, n, size)
n.times do
r = rand size
hash.get(r.to_s)
end
end
Benchmark.bm do |x|
n = 10_000
size = 4
dict = setup_dict(size)
hash = setup_hash(size)
arr = setup_arr(size)
my_hash = setup_my_hash(size)
x.report { dict_exp(dict, n, size) }
x.report { array_exp(arr, n, size) }
x.report { hash_exp(hash, n, size) }
x.report { my_hash_exp(my_hash, n, size) }
end
require 'benchmark/ips'
require 'securerandom'
require_relative './dict'
RANDOM_BYTES = SecureRandom.bytes(16)
class MyHash
def initialize(pairs)
if pairs.length == 1
@hash = MyHash1.new(pairs[0])
elsif pairs.length == 2
@hash = MyHash2.new(pairs[0], pairs[1])
elsif pairs.length == 3
@hash = MyHash3.new(pairs[0], pairs[1], pairs[2])
elsif pairs.length == 4
@hash = MyHash4.new(pairs[0], pairs[1], pairs[2], pairs[3])
else
raise 'Too big'
end
end
def get(key)
@hash.get(key)
end
end
class MyHash1
def initialize(pair)
@key = pair[0]
@value = pair[1]
end
def get(key)
if @key == key
@value
else
nil
end
end
end
class MyHash2
def initialize(pair1, pair2)
@key1 = pair1[0]
@value1 = pair1[1]
@key2 = pair2[0]
@value2 = pair2[1]
end
def get(key)
if @key1 == key
@value1
elsif @key2 == key
@value2
else
nil
end
end
end
class MyHash3
def initialize(pair1, pair2, pair3)
@key1 = pair1[0]
@value1 = pair1[1]
@key2 = pair2[0]
@value2 = pair2[1]
@key3 = pair3[0]
@value3 = pair3[1]
end
def get(key)
if @key1 == key
@value1
elsif @key2 == key
@value2
elsif @key3 == key
@value3
else
nil
end
end
end
class MyHash4
def initialize(pair1, pair2, pair3, pair4)
@key1 = pair1[0]
@value1 = pair1[1]
@key2 = pair2[0]
@value2 = pair2[1]
@key3 = pair3[0]
@value3 = pair3[1]
@key4 = pair4[0]
@value4 = pair4[1]
end
def get(key)
if @key1 == key
@value1
elsif @key2 == key
@value2
elsif @key3 == key
@value3
elsif @key4 == key
@value4
else
nil
end
end
end
def setup_hash(size)
dict = Hash.new
size.times { |i| dict[i.to_s] = i.to_s }
dict
end
def hash_exp(dict, n, size)
n.times do
r = rand size
dict[r.to_s]
end
end
def setup_dict(size)
dict = BYORedis::Dict.new
size.times { |i| dict[i.to_s] = i.to_s }
dict
end
def dict_exp(dict, n, size)
n.times do
r = rand size
dict[r.to_s]
end
end
def setup_arr(size)
arr = []
size.times { |i| arr << [ i.to_s, i.to_s ] }
arr
end
def array_exp(arr, n, size)
n.times do
r = rand size
arr.each { |a| break if a[0] == r.to_s }
end
end
def setup_my_hash(size)
elements = size.times.map { |i| [ i.to_s, i.to_s ] }
my_hash = MyHash.new(elements)
end
def my_hash_exp(hash, n, size)
n.times do
r = rand size
hash.get(r.to_s)
end
end
Benchmark.ips do |x|
n = 10_000
size = 4
dict = setup_dict(size)
hash = setup_hash(size)
arr = setup_arr(size)
my_hash = setup_my_hash(size)
x.report { r = rand size; dict[r.to_s] }
x.report { r = rand size; arr.each { |a| break if a[0] == r.to_s } }
x.report { r = rand size; hash[r.to_s] }
x.report { r = rand size; my_hash.get(r.to_s) }
x.compare!
end
@pjambet
Copy link
Author

pjambet commented Oct 5, 2020

Some results

~/dev/redis-in-ruby/code/chapter-8 chapter-8*
❯ ruby benchmark.rb
       user     system      total        real
   0.243277   0.001670   0.244947 (  0.249265)
   0.011789   0.000049   0.011838 (  0.011899)
   0.008131   0.000070   0.008201 (  0.008506)
   0.007230   0.000017   0.007247 (  0.007284)

~/dev/redis-in-ruby/code/chapter-8 chapter-8*
❯ ruby benchmark.rb
       user     system      total        real
   0.256715   0.002303   0.259018 (  0.274284)
   0.014687   0.000113   0.014800 (  0.016522)
   0.007741   0.000134   0.007875 (  0.008166)
   0.006192   0.000194   0.006386 (  0.007081)

~/dev/redis-in-ruby/code/chapter-8 chapter-8*
❯ ruby benchmark.rb
       user     system      total        real
   0.243805   0.001506   0.245311 (  0.250315)
   0.009368   0.000021   0.009389 (  0.009411)
   0.005721   0.000015   0.005736 (  0.005746)
   0.009247   0.000088   0.009335 (  0.009503)

~/dev/redis-in-ruby/code/chapter-8 chapter-8*
❯ ruby benchmark.rb
       user     system      total        real
   0.256711   0.001378   0.258089 (  0.259848)
   0.008630   0.000024   0.008654 (  0.008667)
   0.004150   0.000021   0.004171 (  0.004202)
   0.008006   0.000056   0.008062 (  0.008326)

~/dev/redis-in-ruby/code/chapter-8 chapter-8*
❯ ruby benchmark.rb
       user     system      total        real
   0.237751   0.001303   0.239054 (  0.242205)
   0.008570   0.000023   0.008593 (  0.008624)
   0.003377   0.000000   0.003377 (  0.003380)
   0.004130   0.000016   0.004146 (  0.004170)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment