2014-05-04 36 views
1

这里是我的脚本堆栈水平红宝石阵太深VS哈希测试

require 'benchmark' 
require 'ostruct' 

Benchmark.bmbm do |x| 
    n=10000 
    array = n.times.map{ |i| OpenStruct.new id: i } 
    hash = Hash[*(array.map{ |s| [s.id, s] }.flatten)] 

    x.report('array') do 
    array.find{ |s| s.id == 100} 
    end 
    x.report('hash') do 
    hash[100] 
    end 
end 

为什么用n=100000我得到:

stack level too deep (SystemStackError) 

不相关,但是,我是以最好的方式构建散列吗?

+0

哈希查找总是比'阵列快。 find'和'OpenStruct'不是正确的使用方法,因为它使用'method_missing'来构建它的属性 – bjhaid

+0

@bjhaid我认为任何基准测试都不一定是“愚蠢的”。有人找到并证明哈希查找速度更快的更好方法是什么? –

+0

什么是正确的事情? – juanpastas

回答

7

您将数万个参数传递给一个方法,这对于Ruby来说太多了,无法处理,导致堆栈错误。

相反只是未展平的,未splatted映射数组传递给Hash.[],因为它接受就好,并给出相同的(正确的)结果(没有SystemStackError):

Hash[array.map { |s| [s.id, s] }] 

顺便说一句,我们可以看到参数计数其实有一个简单的测试问题(而不是专门Hash.[]):

def f(*args); end 
f(*(1..1000000).to_a) #<SystemStackError: stack level too deep>