哪个更有效:$self->method 或 $_[0]->method?

What is more efficient: $self->method or $_[0]->method?

一个 Perl 方法通常以 my $self = shift; 开头,随后使用 $self 来引用它作为方法的对象。

sub foo {
  my $self = shift;
  $self->method;
  ...
  return $self->{_foo}
}

另一种方法是直接使用 $_[0] 而不是将 $_[0] 复制到 $self:

sub foo {
  $_[0]->method;
  ...
  return $_[0]->{_foo}
}

现在,什么更有效率(更快):

  1. 为新变量分配内存$self,获取列表的第一项@_,并在每次调用方法时将此值复制到该变量;

  2. 每次使用 $_[0] 时获取数组的第一项?

纯粹的性能明智,$_[0]更快。

  • 避免创建新变量
  • 避免移动数组@_
  • 唯一的成本是通过索引访问。

然而,这种差异在当今的计算中确实很小。为清楚起见,通常建议使用第一个。

从技术上讲,如果您有足够高分辨率的基准测试工具,使用 $_[0] 应该稍微快一些,至少在您只在 sub 中使用它一两次的情况下是这样。如果您在同一方法中多次引用该对象,$self 可能会因为避免了更多的数组操作而胜出。

所有这些都是绝对、完全没有意义的。

在过去的 15 年里,我一直使用 Perl 作为我的主要语言。我目前是 Perl Web 服务的三名维护者之一,该服务每天处理几百万个请求。如果你在我接触过的每个 Perl 程序的每次调用中的每个方法调用中使用 $_[0]$self 之间的处理时间差异加起来,它将 still 加起来比你问问题或我回答问题的时间还少。可能比我写这句话所花的时间还要少。区别真的是那么小。

所以优化可读性而不是尝试微优化性能。您的维护程序员(包括六个月后的您)将为此感谢您。