Performance 什么更有效:$self->;方法或$\u0]->;方法?

Performance 什么更有效:$self->;方法或$\u0]->;方法?,performance,perl,self,Performance,Perl,Self,Perl方法通常以my$self=shift开始并随后使用$self引用它作为方法的对象 sub foo { my $self = shift; $self->method; ... return $self->{_foo} } 另一种方法是直接使用$\u0]而不是将$\u0]复制到$self: sub foo { $_[0]->method; ... return $_[0]->{_foo} } 现在,什么更高效(更快): 要将内存分配给

Perl方法通常以
my$self=shift开始
并随后使用
$self
引用它作为方法的对象

sub foo {
  my $self = shift;
  $self->method;
  ...
  return $self->{_foo}
}
另一种方法是直接使用
$\u0]
而不是将
$\u0]
复制到
$self

sub foo {
  $_[0]->method;
  ...
  return $_[0]->{_foo}
}
现在,什么更高效(更快):

  • 要将内存分配给新变量
    $self
    ,请获取列表的第一项
    @
    ,并在每次调用方法时将此值复制到该变量

  • 每次使用
    $\u0]
    时获取数组的第一项


  • 纯性能方面,
    $\u0]
    更快

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

    然而,在当今的计算中,这种差异实际上是最小的。为了清晰起见,通常建议使用第一种方法。

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

    所有这些都是毫无意义的。

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


    因此,优化可读性,而不是尝试微观优化性能。您的维护程序员(包括未来六个月内的您)会为此感谢您。

    您使用
    $\u0]->方法在速度方面一无所获(类似于单引号与双引号“优化”),只会失去源代码的可读性。这种微优化就像是更换汽车的油漆以使其运行更快。除非你是一级方程式赛车手,否则差别可以忽略不计。