2

次の方法が与えられます:

def some_hash
  {
    :one => 1,
    :two => 2,
  }
end

ハッシュをメモ化することでパフォーマンス上のメリットはありますか?

def some_hash
  @some_hash ||= {
    :one => 1,
    :two => 2,
  }
end
4

2 に答える 2

4

メモ化されたバリアントは約 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)
于 2012-08-31T18:13:34.813 に答える
3

コンパイラ/インタープリターは、最初の形式を 2 番目の形式に自動的に変換できませ

a1, b1 = hash1, hash1
a1[:one] = 'ONE'

a2, b2 = hash2, hash2
a2[:one] = 'ONE'

p b1[:one], b2[:one]
# 1
# 'ONE'

繰り返しますが、共有された可変状態は醜い頭をもたげます。いいえ、子供たち、それは並行性だけではありません!

于 2012-09-01T01:53:48.497 に答える