2011-06-20 223 views
3

我想讀取並處理來自文件的輸入集,然後將其打印出來。 有3個鍵我需要用來存儲數據。 假設3個鍵k1, k2, k3Perl多哈希與單哈希

以下哪項會提供更好的性能

$hash{k1}->{k2}->{k3} = $val; 

$hash{"k1,k2,k3"} = $val; 

對於我剛纔的問題我得到的所有Perl中的哈希鍵被視爲答案字符串。

+0

每層中大約需要多少把鑰匙? –

+0

我將在每個關卡中至少有100個關鍵..所以總共有300個關鍵 – Raghuram

+6

您正在過早地進行優化。這將以毫秒運行。 –

回答

4

散列查找速度與散列中項目的數量無關,因此僅執行一次散列查找的版本將比執行三次散列查找的版本更快地執行操作的散列查找部分。但另一方面,單一查找版本必須將三個密鑰連接成單個字符串,然後才能將其用作組合密鑰;如果這個字符串是匿名的(例如,$hash{"$a,$b,$c"}),這可能會涉及一些有趣的東西,如內存分配。總體而言,我希望這種串聯速度足夠快,以至於在大多數情況下,一次查找版本比三次查找版本快,但要知道哪種情況更快,您的情況下的唯一方法是編寫相同的兩種款式代碼和Benchmark的區別。然而,就像其他人已經說過的一樣,這是一個不成熟,毫無價值的微觀優化。除非你知道你有一個性能問題(或者你有歷史性能數據表明問題正在發展並將在不久的將來發生)你已經對你的代碼進行了剖析,以確定哈希查找是什麼原因你的表現問題,你浪費你的時間擔心這一點。哈希查找是快速。這是幾乎沒有一個真正的標杆,但是:

$ time perl -e '$foo{bar} for 1 .. 1_000_000' 
real 0m0.089s 
user 0m0.088s 
sys 0m0.000s 

在這個平凡的(,無可否認的,高度有缺陷)的例子,我有一個速度相當於每秒大約1100萬哈希查找。在你花時間提問的時候,你的計算機可能已經完成了數億次,如果不是億次的散列查找。

將你的散列查找寫成你的應用程序中最具可讀性和最易維護的風格。如果您嘗試儘可能快地優化它,那麼浪費的程序員時間將比您希望通過優化保存的任何處理時間都要大(很多!)個數量級。

5

除非您真正處理大型數據集,否則請使用哪一個生成更清晰的代碼。我可能是錯的,但這是不成熟的優化。

如果不是,這可能取決於可能的鍵的範圍。如果訂購不是問題,請按順序排列數據,以便​​是最小的一組密鑰,k3是最大的。我懷疑你會用這種方式在哈希上使用更少的內存。根據你的數據集,它可能是謹慎的預設你的哈希值(我認爲%hash = 100做的伎倆)。

至於哪個更快,只有分析會告訴。嘗試兩種方式並親自看看。

此外,請注意$hash{k1}->{k2}-{k3}是不必要的。你可以寫$hash{k1}{k2}{k3}。解除引用不在之間括號,無論是正方形還是捲曲。

2

如果你有內存方面的問題,我建議在開發的早期階段使用CPAN的Devel::Size來獲得兩種選擇的大小。 否則使用一個看起來很友善的人!