我看到一篇关于perl脚本性能的文章。
他们提到的一件事是使用哈希引用而不是每次都直接访问哈希。
通过引用哈希而不是直接访问可以获得哪些好处?
我的脚本从服务器名称列表中读取,如果有人需要那么多,理论上可能多达100台机器。因此,我可以为我的脚本提供的任何提升都会很棒。
答案 0 :(得分:8)
我认为$hashref->{"foo"}
优于$hash{"foo"}
的优点。将散列引用而不是完整哈希传递给子程序可能有一个小优势,但这就是我能想到的全部内容。我同意Rafe的评论,即100项的散列不太可能给你带来性能问题。除非您知道存在与哈希表访问相关的性能问题,否则请不要理会。 p>
“优化调试程序比调试优化程序更容易。”
答案 1 :(得分:2)
我之前评论说,100对于哈希来说很小。我将用更一般的声明来证明这一点:
除非出现问题,否则不要担心。你的脚本运行缓慢吗?如果没有,那么不要修复没有破坏的东西。过早优化对可读性不利,往往会导致错误。这是一个更大的问题,2004年,我认为你正在阅读的文章是写的。但今天,RAM很便宜。
也就是说,使用引用提供比传递值更好的性能的原因是,当您将哈希作为参数传递给子时,通常必须复制它使用更多内存。这只是一个优化,如果a。)你将大哈希传递给很多函数并且b。)这会导致你使用太多的内存。
答案 2 :(得分:0)
好吧,正如Rafe已经提到的那样,一个包含100个元素的哈希并不是很大。有人可能会争辩说使用哈希引用并没有比使用普通哈希更有优势 - 但是它也没有给你一个特别的缺点(至少我从来没有碰到过一个)。因此,人们的想法并不像过早的优化那么糟糕。
如果您的脚本运行速度太慢,那么您可能希望使用a profiler找出您失去时间的位置。
答案 3 :(得分:0)
很抱歉,如果这就是它所说的那篇文章错了。除了访问哈希元素之外,没有办法解除引用,然后访问哈希元素所花费的时间比访问哈希元素要少。
>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所花费的额外时间应该是无关紧要的。