2011-06-20 221 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来获得两种选择的大小。 否则使用一个看起来很友善的人!