2014-05-04 40 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>