Perl调用带括号和不带括号的方法

dal*_*sam 4 perl

一些Perl书籍建议在调用类方法时使用括号,这说明这有助于使解析器不必猜测代码的意图.但是,我所看到的几乎所有Perl代码(包括cpan上的模块)在调用没有参数的方法时很少使用括号.

放下这些括号是否正常,或者我应该总是输入它们.

我编写了一个小测试代码来衡量调用带括号和无括号的方法之间的区别,并且它确实显示了仅使用两种方法的类在1%和2%之间的微小差异.我想如果班级很大,这可能会增加.

这是我用来测试的测试脚本:

#!/usr/bin/perl

use Benchmark qw(:all);

{
    package Messages;

    sub new {
        my ($self) = @_;
        return bless {}, $self;
    }

    sub message {
        my ($self) = @_;
        return "Hello world";
    }

    sub another {
        my ($self) = @_;
        return "Another Hello world";
    }
}

my $class = Messages->new();

cmpthese(10_000_000, {
    'with   ()  ' => sub { $class->message() },
    'without    ()  ' => sub { $class->message },
});
Run Code Online (Sandbox Code Playgroud)

这是基准测试的结果:

                 Rate       without ()       with ()    
without ()      3320053/s          --         -1%
with    ()      3338898/s          1%          --
Run Code Online (Sandbox Code Playgroud)

我想如果应用程序使用了数百个模块,并且每个模块都有数百个没有括号的方法,那么这是否会增加很多速度差异?

如果是这样,为什么每个人都没有括号编码?

Cal*_*ahl 6

1%的差异是系统噪音.两个版本都编译为完全相同的字节码,因此它们之间不存在系统差异.使用哪种变体使您的代码更易于阅读.

如果你想看到它编译的内容,你可以这样做:

perl -MO=Concise -E '$foo->bar()'
Run Code Online (Sandbox Code Playgroud)


smn*_*npl 1

因为你能。真的。我认为。由于 Perl 允许如此多的功能,人们正在使用它。有时是好的,因为你可以用短序列编写非常复杂的东西,有时是坏的,因为它经常变得复杂(特别是对于 Perl 新手来说)。

这也取决于您的程序的作用。差异应该只存在于编译时间上(我认为)。通常,编译时间只是整个应用程序生命周期的一小部分,并不那么重要。

  • 1% 可能是由系统上的其他原因引起的。不确定我是否会过于依赖这一点。但这确实是一个公平的观点。使用括号是更好的做法,我绝对同意这一点。如前所述,人们可能会这样做,因为他们可以。 (2认同)