使用哈希引用的好处?

| 我看到了一篇有关perl脚本性能的文章。 他们提到的一件事是使用哈希引用,而不是每次都直接访问哈希。 通过引用散列而不是直接访问可以获得什么好处? 我的脚本从服务器名称列表中读取,如果有人需要,服务器上的理论上最多可以有100台计算机。因此,我可以对脚本进行的任何改进都会很棒。     
已邀请:
我认为
$hashref->{\"foo\"}
$hash{\"foo\"}
没有太多优势。将散列引用而不是完整的散列传递给子例程可能会有一个小优势,但这就是我能想到的全部。我同意Rafe的评论,即散列100个项目不太可能给您带来性能问题。除非您知道与哈希表访问有关的性能问题,否则请不要理会。 \“优化调试的程序比调试优化的程序容易。\”     
我之前评论说,哈希值100很小。我将用更笼统的陈述来说明这一点: 除非有问题,否则不要担心。您的脚本运行缓慢吗?如果不是,则不要修复未损坏的内容。过早的优化不利于提高可读性,并经常导致错误。在我认为您正在阅读的文章写于2004年时,这是一个更大的问题。但是今天,RAM很便宜。 就是说,使用引用比通过值获得更好的性能的原因是,当您将哈希作为参数传递给子对象时,通常必须将其复制使用更多的内存。只有在以下情况下才需要进行此优化:a。)将大量散列传递给函数,并且b。)这导致您使用过多的内存。     
好了,正如Rafe已经提到的那样,具有100个元素的哈希值并不是很大。有人可能会争辩说,使用散列引用不会比使用普通散列给您带来很多优势-但是,它也不会给您带来特定的劣势(至少我从未遇到过)。因此,过早的优化并不像人们想象的那样糟糕。 如果脚本运行太慢,则可能需要使用探查器来找出浪费时间。     
抱歉,但是如果那是它的意思,那篇文章是错误的。与仅访问哈希元素相比,解引用而不是访问哈希元素所花费的时间是不可能的。
>perl -MO=Concise,-exec -e\"$x = $h{x}\"
...
3  <#> gv[*h] s
4  <1> rv2hv sKR/1
5  <$> const[PV \"x\"] s/BARE
6  <2> helem sK/2
...

>perl -MO=Concise,-exec -e\"$x = $h->{x}\"
...
3  <#> gv[*h] s
4  <1> rv2sv sKM/DREFHV,1    <---
5  <1> rv2hv[t3] sKR/1
6  <$> const[PV \"x\"] s/BARE
7  <2> helem sK/2
...
就是说,deref所花费的额外时间应该如此之小以至于无关紧要。     

要回复问题请先登录注册