diff --git a/code/hash/symbol-vs-string-keys-building.rb b/code/hash/symbol-vs-string-keys-building.rb new file mode 100644 index 0000000..58f47f8 --- /dev/null +++ b/code/hash/symbol-vs-string-keys-building.rb @@ -0,0 +1,31 @@ +require 'benchmark/ips' + +# The same 1000 keys, as Symbols, frozen Strings and plain Strings, each mapped to its index. +SYMBOL_KEYS = (1..1000).map { |i| :"key_#{i}" } +FROZEN_KEYS = (1..1000).map { |i| "key_#{i}".freeze } +STRING_KEYS = (1..1000).map { |i| "key_#{i}" } + +def build(keys) + keys.each_with_index.map { |key, index| [key, index] }.to_h +end + +# Symbol and frozen String keys tie on Ruby 4.0. +def faster + build(SYMBOL_KEYS) +end + +# A Hash copies and freezes a plain String key, but keeps a frozen one as it is. +def fast + build(FROZEN_KEYS) +end + +def slow + build(STRING_KEYS) +end + +Benchmark.ips do |x| + x.report('Symbol Keys') { faster } + x.report('Frozen Keys') { fast } + x.report('String Keys') { slow } + x.compare! +end diff --git a/code/hash/symbol-vs-string-keys-reading.rb b/code/hash/symbol-vs-string-keys-reading.rb new file mode 100644 index 0000000..8d776ea --- /dev/null +++ b/code/hash/symbol-vs-string-keys-reading.rb @@ -0,0 +1,30 @@ +require 'benchmark/ips' + +# The same 1000 keys, as Symbols, frozen Strings and plain Strings, each mapped to its index. +SYMBOL_KEYS = (1..1000).map { |i| :"key_#{i}" } +FROZEN_KEYS = (1..1000).map { |i| "key_#{i}".freeze } +STRING_KEYS = (1..1000).map { |i| "key_#{i}" } + +SYMBOL_HASH = SYMBOL_KEYS.each_with_index.map { |key, index| [key, index] }.to_h +FROZEN_HASH = FROZEN_KEYS.each_with_index.map { |key, index| [key, index] }.to_h +STRING_HASH = STRING_KEYS.each_with_index.map { |key, index| [key, index] }.to_h + +# Reads every key once. +def faster + SYMBOL_KEYS.each { |key| SYMBOL_HASH[key] } +end + +def fast + FROZEN_KEYS.each { |key| FROZEN_HASH[key] } +end + +def slow + STRING_KEYS.each { |key| STRING_HASH[key] } +end + +Benchmark.ips do |x| + x.report('Symbol Keys') { faster } + x.report('Frozen Keys') { fast } + x.report('String Keys') { slow } + x.compare! +end