【问题标题】:Perl Multi hash vs Single hashPerl 多散列与单散列
【发布时间】:2011-06-20 10:16:23
【问题描述】:

我想从文件中读取和处理输入集,然后将其打印出来。 我需要使用 3 个键来存储数据。 假设这 3 个键是 k1, k2, k3

以下哪项会提供更好的性能

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

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

对于我之前的问题,我得到的答案是所有 perl 哈希键都被视为字符串。

【问题讨论】:

  • 每层大约有多少个密钥?
  • 我将在每个级别至少有 100 个键..所以总共 300 个键
  • 您过早地进行了优化。这将在几毫秒内运行。
  • 毫秒,如果不是微秒...
  • 我想,他问的是速度。在我的建议中,perl 中的哈希是树,所以,如果你想要更快的速度,你需要更多的树层。如我错了请纠正我。 (而且它还取决于传入键的概率论,所以不可能所有键看起来都像 {k1,k2,kn}, n>=3)

标签: perl perl-data-structures


【解决方案1】:

除非您真的要处理大型数据集,否则请使用能产生更清晰代码的任何一种。我可能错了,但这有点过早优化的味道。

如果不是,这可能取决于可能键的范围。如果排序不是问题,请按顺序排列数据,使k1 是最小的键集,k3 是最大的。我怀疑你会以这种方式在哈希上使用更少的内存。根据您的数据集,甚至可以谨慎地预先确定您的哈希值(我认为 %hash = 100 可以解决问题)。

至于哪个更快,只有分析才能告诉我们。两者都试一下,自己看看。

另外,请注意$hash{k1}->{k2}-{k3} 是不必要的。你可以写$hash{k1}{k2}{k3}。取消引用不需要括号之间,无论是方括号还是花括号。

【讨论】:

    【解决方案2】:

    哈希查找速度与哈希中的项目数无关,因此只执行一次哈希查找的版本将比执行三次哈希查找的版本更快地执行操作的哈希查找部分。但是,另一方面,单查找版本必须将三个键连接成一个字符串,然后才能将它们用作组合键;如果这个字符串是匿名的(例如,$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 万次哈希查找。在您提出问题的时间里,您的计算机可能已经完成了数亿甚至 十亿 次的哈希查找。

    以在您的应用程序中最易读和最易于维护的任何样式编写您的哈希查找。如果您尝试尽可能快地对其进行优化,那么浪费的程序员时间将比您希望通过优化节省的任何处理时间大(很多!)数量级。

    【讨论】:

      【解决方案3】:

      如果您有内存问题,我建议您在早期开发阶段使用 CPAN 中的 Devel::Size 以获得两种替代方案的大小。 否则请使用对您友好的那个!

      【讨论】:

        猜你喜欢
        • 2011-03-13
        • 2012-08-03
        • 2013-03-14
        • 2019-01-13
        • 1970-01-01
        • 2015-07-23
        • 1970-01-01
        • 1970-01-01
        • 2014-05-19
        相关资源
        最近更新 更多