Ruby中的不同记忆技术
如果您是一名ruby程序员,那么您可能会遇到哈希块记忆模式。作为一个简单的例子,我向您展示了斐波那契序列的记忆版本:Ruby中的不同记忆技术,ruby,performance,memoization,Ruby,Performance,Memoization,如果您是一名ruby程序员,那么您可能会遇到哈希块记忆模式。作为一个简单的例子,我向您展示了斐波那契序列的记忆版本: fib_hash = Hash.new do |h,i| h[i] = h[i-1] + h[i-2] end # establish the base cases fib_hash[1] = 1; fib_hash[2] = 1 当然,这不是创建斐波那契序列记忆版本的唯一方法。您还可以执行以下操作: @cache = {}; @cache[1] = 1; @cache[2
fib_hash = Hash.new do |h,i|
h[i] = h[i-1] + h[i-2]
end
# establish the base cases
fib_hash[1] = 1; fib_hash[2] = 1
当然,这不是创建斐波那契序列记忆版本的唯一方法。您还可以执行以下操作:
@cache = {}; @cache[1] = 1; @cache[2] = 1
def memo_fib(n)
@cache[n] ||= (memo_fib(n-1) + memo_fib(n-2))
end
希望您看到散列块记忆模式如何映射到第二个版本,这在许多其他语言中更为常见。我想知道的是,这两个版本之间是否有任何差异?我无法摆脱散列块版本更高效的感觉,但我无法真正证明原因。MRI 1.8.7中的基准测试产生:
- 哈希块:0.44秒
- 非散列块:0.41秒
- 哈希块:0.24秒
- 非散列块:0.28秒
def reset_fib_hash
@fib_hash = Hash.new do |h,i|
h[i] = h[i-1] + h[i-2]
end
# establish the base cases
@fib_hash[1] = 1; @fib_hash[2] = 1
end
start_time = Time.now
100.times do
reset_fib_hash
(1..1000).each do |i|
@fib_hash[i]
end
end
p Time.now - start_time
def reset_fib_hash
@cache = {}; @cache[1] = 1; @cache[2] = 1
end
def memo_fib(n)
@cache[n] ||= (memo_fib(n-1) + memo_fib(n-2))
end
start_time = Time.now
100.times do
reset_fib_hash
(1..1000).each do |i|
memo_fib(i)
end
end
p Time.now - start_time
以下是非散列块的基准:
def reset_fib_hash
@fib_hash = Hash.new do |h,i|
h[i] = h[i-1] + h[i-2]
end
# establish the base cases
@fib_hash[1] = 1; @fib_hash[2] = 1
end
start_time = Time.now
100.times do
reset_fib_hash
(1..1000).each do |i|
@fib_hash[i]
end
end
p Time.now - start_time
def reset_fib_hash
@cache = {}; @cache[1] = 1; @cache[2] = 1
end
def memo_fib(n)
@cache[n] ||= (memo_fib(n-1) + memo_fib(n-2))
end
start_time = Time.now
100.times do
reset_fib_hash
(1..1000).each do |i|
memo_fib(i)
end
end
p Time.now - start_time
所以方法调用比块调用便宜。很高兴知道,谢谢。事实上我在1.9.1 ruby版本上做了一个测试,哈希块版本更快。@davidk01,我很遗憾没有说我测试了哪个版本。正如你可能猜到的,它是1.8.7。我在答案中添加了MRI 1.9.0结果。