哪个更有效:$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}
}
现在,什么更有效率(更快):
为新变量分配内存$self
,获取列表的第一项@_
,并在每次调用方法时将此值复制到该变量;
每次使用 $_[0]
时获取数组的第一项?
纯粹的性能明智,$_[0]
更快。
- 避免创建新变量
- 避免移动数组
@_
- 唯一的成本是通过索引访问。
然而,这种差异在当今的计算中确实很小。为清楚起见,通常建议使用第一个。
从技术上讲,如果您有足够高分辨率的基准测试工具,使用 $_[0]
应该稍微快一些,至少在您只在 sub
中使用它一两次的情况下是这样。如果您在同一方法中多次引用该对象,$self
可能会因为避免了更多的数组操作而胜出。
所有这些都是绝对、完全没有意义的。
在过去的 15 年里,我一直使用 Perl 作为我的主要语言。我目前是 Perl Web 服务的三名维护者之一,该服务每天处理几百万个请求。如果你在我接触过的每个 Perl 程序的每次调用中的每个方法调用中使用 $_[0]
或 $self
之间的处理时间差异加起来,它将 still 加起来比你问问题或我回答问题的时间还少。可能比我写这句话所花的时间还要少。区别真的是那么小。
所以优化可读性而不是尝试微优化性能。您的维护程序员(包括六个月后的您)将为此感谢您。
一个 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}
}
现在,什么更有效率(更快):
为新变量分配内存
$self
,获取列表的第一项@_
,并在每次调用方法时将此值复制到该变量;每次使用
$_[0]
时获取数组的第一项?
纯粹的性能明智,$_[0]
更快。
- 避免创建新变量
- 避免移动数组
@_
- 唯一的成本是通过索引访问。
然而,这种差异在当今的计算中确实很小。为清楚起见,通常建议使用第一个。
从技术上讲,如果您有足够高分辨率的基准测试工具,使用 $_[0]
应该稍微快一些,至少在您只在 sub
中使用它一两次的情况下是这样。如果您在同一方法中多次引用该对象,$self
可能会因为避免了更多的数组操作而胜出。
所有这些都是绝对、完全没有意义的。
在过去的 15 年里,我一直使用 Perl 作为我的主要语言。我目前是 Perl Web 服务的三名维护者之一,该服务每天处理几百万个请求。如果你在我接触过的每个 Perl 程序的每次调用中的每个方法调用中使用 $_[0]
或 $self
之间的处理时间差异加起来,它将 still 加起来比你问问题或我回答问题的时间还少。可能比我写这句话所花的时间还要少。区别真的是那么小。
所以优化可读性而不是尝试微优化性能。您的维护程序员(包括六个月后的您)将为此感谢您。