从Perl子例程返回一个完整的数组效率低吗?

Fra*_*ank 14 perl reference function pass-by-reference

我经常在Perl中有一个子程序,用一些信息填充数组.由于我也习惯于使用C++进行攻击,我发现自己经常在Perl中这样做,使用引用:

my @array;
getInfo(\@array);

sub getInfo {
   my ($arrayRef) = @_;
   push @$arrayRef, "obama";
   # ...
}
Run Code Online (Sandbox Code Playgroud)

而不是更简单的版本:

my @array = getInfo();

sub getInfo {
   my @array;
   push @array, "obama";
   # ...
   return @array;
}
Run Code Online (Sandbox Code Playgroud)

当然,原因是我不希望在子例程中本地创建数组,然后在返回时复制.

是对的吗?或者Perl是否优化了它?

use*_*400 18

那么首先返回一个数组引用呢?

sub getInfo {
  my $array_ref = [];
  push @$array_ref, 'foo';
  # ...
  return $array_ref;
}

my $a_ref = getInfo();
# or if you want the array expanded
my @array = @{getInfo()};
Run Code Online (Sandbox Code Playgroud)

根据德曼的评论编辑:

也可以在函数中使用普通数组并返回对它的引用.

sub getInfo {
  my @array;
  push @array, 'foo';
  # ...
  return \@array;
}      
Run Code Online (Sandbox Code Playgroud)


Leo*_*ans 13

传递引用更有效,但差异并不像C++那么大.参数值本身(表示:数组中的值)总是通过引用传递(尽管复制了返回的值).

问题是:这有关系吗?大多数时候,它没有.如果您要返回5个元素,请不要理会它.如果您要返回/传递100'000个元素,请使用引用.只有在瓶颈的情况下才对其进行优化.


Hyn*_*dil 8

如果我看一下你的例子并考虑你想做什么,我习惯用这种方式写它:

sub getInfo {
  my @array;
  push @array, 'obama';
  # ...
  return \@array;
}
Run Code Online (Sandbox Code Playgroud)

当我需要返回大量数据时,在我看来这是一个简单的版本.您在第一个代码段中编写时不需要在外部分配数组sub,因为my这样做是为了您.反正你不应该做过早的优化,莱昂TIMMERMANS 建议.


Dav*_*man 5

回答最后的思考,不,Perl 并没有对此进行优化。事实上,它不能,因为返回数组和返回标量是根本不同的。

如果您正在处理大量数据或者性能是主要考虑因素,那么您的 C 习惯将对您很有帮助 - 传递和返回对数据结构的引用而不是结构本身,这样就不需要复制它们。但是,正如 Leon Timmermans 指出的那样,绝大多数时候,您处理的数据量较小,而且性能并不是什么大问题,因此请以最易读的方式进行操作。