Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 使用散列引用的好处?_Perl_Performance_Perl Hash - Fatal编程技术网

Perl 使用散列引用的好处?

Perl 使用散列引用的好处?,perl,performance,perl-hash,Perl,Performance,Perl Hash,我看了一篇关于perl脚本性能的文章 他们提到的一件事是使用散列引用,而不是每次都直接访问散列 引用散列而不是直接访问有什么好处 我的脚本从服务器名称列表中读取,理论上,如果有人需要100台机器,那么这些服务器名称可能多达100台。因此,我能给我的脚本带来的任何提升都将是巨大的。我认为$hashref->{“foo”}与$hash{“foo”}相比没有多少优势。将散列引用而不是完整的散列传递给子例程可能有一个小优势,但这就是我所能想到的。我同意Rafe的评论,即100项的散列不太可能给您带来性能

我看了一篇关于perl脚本性能的文章

他们提到的一件事是使用散列引用,而不是每次都直接访问散列

引用散列而不是直接访问有什么好处


我的脚本从服务器名称列表中读取,理论上,如果有人需要100台机器,那么这些服务器名称可能多达100台。因此,我能给我的脚本带来的任何提升都将是巨大的。

我认为
$hashref->{“foo”}
$hash{“foo”}
相比没有多少优势。将散列引用而不是完整的散列传递给子例程可能有一个小优势,但这就是我所能想到的。我同意Rafe的评论,即100项的散列不太可能给您带来性能问题。除非您知道您有一个与哈希表访问相关的性能问题,否则不要为此烦恼


“优化调试过的程序比调试优化过的程序容易。”

我认为
$hashref->{“foo”}
$hash{“foo”}
没有多少优势。将散列引用而不是完整的散列传递给子例程可能有一个小优势,但这就是我所能想到的。我同意Rafe的评论,即100项的散列不太可能给您带来性能问题。除非您知道您有一个与哈希表访问相关的性能问题,否则不要为此烦恼


“优化一个调试过的程序比调试一个优化过的程序更容易。”

我之前评论过,100对于一个散列来说很小。我将用一个更一般的陈述来证明这一点:

除非有问题,否则不要担心。脚本运行缓慢吗?如果没有,则不要修复未损坏的。过早的优化不利于可读性,并且常常会导致错误。这在2004年是一个更大的问题,当时我猜你正在读的那篇文章是写好的。但是今天,RAM很便宜


也就是说,使用引用网络比按值传递性能更好的原因是,当您将散列作为参数传递给sub时,通常必须复制它,这会占用更多内存。这只是一个需要进行的优化,如果a.)你将大量的散列传递给函数,b.)这会导致你使用太多的内存。

我之前评论过,100对于散列来说很小。我将用一个更一般的陈述来证明这一点:

除非有问题,否则不要担心。脚本运行缓慢吗?如果没有,则不要修复未损坏的。过早的优化不利于可读性,并且常常会导致错误。这在2004年是一个更大的问题,当时我猜你正在读的那篇文章是写好的。但是今天,RAM很便宜


也就是说,使用引用网络比按值传递性能更好的原因是,当您将散列作为参数传递给sub时,通常必须复制它,这会占用更多内存。这只是一个需要进行的优化,如果a.)向函数大量传递大哈希值,b.)这会导致使用太多内存。

正如Rafe已经提到的,一个包含100个元素的哈希值并不是很大。有人可能会说,使用散列引用与使用普通散列相比,并没有给您带来太多优势,但它也没有给您带来特别的劣势(至少我从未遇到过)。因此,这并不像人们想象的那样是一个不成熟的优化


如果您的脚本运行太慢,那么您可能希望使用来找出您在哪里浪费时间。

好吧,正如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
...
>perl-MO=简明,-exec-e“$x=$h{x}”
...
3 gv[*h]s
4 rv2hv sKR/1
5常数[PV“x”]s/裸
6直升机sK/2
...
>perl-MO=简明,-exec-e“$x=$h->{x}”
...
3 gv[*h]s

4 rv2sv sKM/DREFHV,1对不起,如果那篇文章是这么说的话,那就是错的。取消引用然后访问散列元素所花费的时间绝不可能比仅访问散列元素所花费的时间少

>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
...
>perl-MO=简明,-exec-e“$x=$h{x}”
...
3 gv[*h]s
4 rv2hv sKR/1
5常数[PV“x”]s/裸
6直升机sK/2
...
>perl-MO=简明,-exec-e“$x=$h->{x}”
...
3 gv[*h]s

4 rv2sv sKM/DREFHV,1你意识到100个项目的散列是很小的,任何操作在体面的硬件上几乎都是瞬时的?呃,我认为这越来越大了……什么是大的?数以百万计的?好吧,这将是一个散列,这100台服务器可能有几个文件路径和类似的内部。今天,可能有1000个元素。考虑到今天一台普通的笔记本电脑有4GB内存和双核,100真的什么都不是。很高兴知道,所以我没有理由这么做。但至少是这样。我最近读了一些相关的文章。他们认为大的东西是有趣的。你知道100个项目的杂凑很小,而且任何操作都会在正品的硬件上几乎瞬间发生吗?嗯,我以为它正在变大…,什么被认为是大的?数以百万计的?好吧,这将是一个散列,这100台服务器可能有几个文件路径和类似的内部。今天,可能有1000个元素。考虑到今天一台普通的笔记本电脑有4GB内存和双核,100真的什么都不是。很高兴知道,所以我没有理由这么做。但至少是这样。我最近读了一些相关的文章。他们认为大是有趣的。我喜欢“