我想从文件中读取和处理输入集,然后将其打印出来。
我需要使用3个密钥来存储数据。
假设3个键是k1, k2, k3
以下哪项会带来更好的表现
$hash{k1}->{k2}->{k3} = $val;
或
$hash{"k1,k2,k3"} = $val;
对于我之前的问题,我得到的答案是所有perl哈希键都被视为字符串。
答案 0 :(得分:5)
除非你真的在处理大型数据集,否则请使用哪一个产生更清晰的代码。我可能错了,但这种过早的优化过程。
如果不是,这可能取决于可能的键范围。如果排序不是问题,请按顺序排列数据,以便k1
是最小的密钥集,k3
是最大的。我怀疑你会以这种方式在哈希上使用更少的内存。根据您的数据集,甚至可以谨慎地预测您的哈希值(我认为%hash = 100
可以解决问题)。
至于哪个更快,只有剖析才能说明。试试两个并亲自看看。
另外,请注意$hash{k1}->{k2}-{k3}
是不必要的。你可以写$hash{k1}{k2}{k3}
。 括号中的解除引用不是方形或卷曲的。
答案 1 :(得分: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万次哈希查找。在您提出问题时,您的计算机可能已完成数亿次(如果不是数十亿次)哈希查找。
以您应用程序中最可读和最易维护的任何样式编写哈希查找。如果你试图尽可能快地优化它,那么浪费的程序员时间将比你希望通过优化保存的任何处理时间(很多!)大几个数量级。
答案 2 :(得分:2)
如果您有内存问题,我建议您在早期开发中使用CPAN中的Devel::Size
来获取两种替代方案的大小。
否则请使用对你友好的那个!