我想读取和处理文件中的输入集,然后将其打印出来。我需要使用 3 个键来存储数据。假设 3 个键是k1, k2, k3
以下哪项会提供更好的性能
$hash{k1}->{k2}->{k3} = $val;
或者
$hash{"k1,k2,k3"} = $val;
对于我之前的问题,我得到的答案是所有 perl 哈希键都被视为字符串。
我想读取和处理文件中的输入集,然后将其打印出来。我需要使用 3 个键来存储数据。假设 3 个键是k1, k2, k3
以下哪项会提供更好的性能
$hash{k1}->{k2}->{k3} = $val;
或者
$hash{"k1,k2,k3"} = $val;
对于我之前的问题,我得到的答案是所有 perl 哈希键都被视为字符串。
除非您真的在处理大型数据集,否则请使用产生更清晰代码的任何一个。我可能错了,但这有点过早优化的味道。
如果不是,这可能取决于可能键的范围。如果排序不是问题,请按顺序排列数据,以使k1
键集最小且k3
最大。我怀疑你会以这种方式在哈希上使用更少的内存。根据您的数据集,甚至可以谨慎地预先确定您的哈希值(我认为%hash = 100
可以解决问题)。
至于哪个更快,只有分析才能告诉我们。两者都试一下,自己看看。
另外,请注意这$hash{k1}->{k2}-{k3}
是不必要的。你可以写$hash{k1}{k2}{k3}
。方括号或花括号之间不需要取消引用。
散列查找速度与散列中的项目数无关,因此只进行一次散列查找的版本将比执行三次散列查找的版本更快地执行操作的散列查找部分。但是,另一方面,单查找版本必须将三个键连接成一个字符串,然后才能将它们用作组合键;如果这个字符串是匿名的(例如,$hash{"$a,$b,$c"}
),这可能会涉及一些有趣的东西,比如内存分配。总的来说,我希望连接足够快,以至于在大多数情况下,单查找版本会比三查找版本快,但是要知道在您的情况下哪个更快的唯一方法是编写相同的代码两者风格和基准的区别。
然而,就像其他人已经说过的那样,这是一个不成熟且毫无价值的微优化。除非您知道自己有性能问题(或者您有历史性能数据表明问题正在发展并将在不久的将来出现在您身上)并且您已经分析了您的代码以确定哈希查找是您的性能的原因问题,你在浪费时间担心这个。哈希查找速度很快。这几乎不是一个真正的基准,但是:
$ time perl -e '$foo{bar} for 1 .. 1_000_000'
real 0m0.089s
user 0m0.088s
sys 0m0.000s
在这个微不足道的(诚然,有很大缺陷的)示例中,我得到的速率相当于每秒大约 1100 万次哈希查找。在您提出问题的时间里,您的计算机可能已经完成了数亿甚至数十亿次的哈希查找。
以在您的应用程序中最易读和最可维护的任何样式编写您的哈希查找。如果您尝试将其优化为尽可能快,则浪费的程序员时间将(很多!)数量级大于您希望通过优化节省的任何处理时间。
如果您有内存问题,我建议Devel::Size
在开发的早期使用 CPAN 来获得两种替代方案的大小。否则,请使用对您友好的那个!