次の方法が与えられます:
def some_hash
{
:one => 1,
:two => 2,
}
end
ハッシュをメモ化することでパフォーマンス上のメリットはありますか?
def some_hash
@some_hash ||= {
:one => 1,
:two => 2,
}
end
次の方法が与えられます:
def some_hash
{
:one => 1,
:two => 2,
}
end
ハッシュをメモ化することでパフォーマンス上のメリットはありますか?
def some_hash
@some_hash ||= {
:one => 1,
:two => 2,
}
end
メモ化されたバリアントは約 7.5 倍高速のようです。
def hash1
{
:one => 1,
:two => 2,
}
end
def hash2
@some_hash ||= {
:one => 1,
:two => 2,
}
end
require 'benchmark'
Benchmark.bmbm do |b|
b.report do
1_000_000.times{ hash1 }
end
end
Benchmark.bmbm do |b|
b.report do
1_000_000.times{ hash2 }
end
end
Rehearsal ------------------------------------
1.470000 0.030000 1.500000 ( 1.499750)
--------------------------- total: 1.500000sec
user system total real
1.570000 0.030000 1.600000 ( 1.739230)
Rehearsal ------------------------------------
0.210000 0.000000 0.210000 ( 0.231601)
--------------------------- total: 0.210000sec
user system total real
0.210000 0.010000 0.220000 ( 0.234898)
コンパイラ/インタープリターは、最初の形式を 2 番目の形式に自動的に変換できません。
a1, b1 = hash1, hash1
a1[:one] = 'ONE'
a2, b2 = hash2, hash2
a2[:one] = 'ONE'
p b1[:one], b2[:one]
# 1
# 'ONE'
繰り返しますが、共有された可変状態は醜い頭をもたげます。いいえ、子供たち、それは並行性だけではありません!