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

带括号和不带括号的Perl调用方法,perl,Perl,一些Perl书籍建议在调用类方法时使用括号,说这有助于防止解析器猜测代码的意图。然而,我看到的几乎所有Perl代码(包括cpan上的模块)在调用没有参数的方法时很少使用括号 省略这些括号是正常的还是我应该一直键入它们 我编写了一个小测试代码来测量调用带括号和不带括号的方法之间的差异,它确实显示了一个只有两个方法的类在1%和2%之间的小差异。我想如果班级人数多的话,这可能会提高 以下是我用来进行基准测试的测试脚本: #!/usr/bin/perl use Benchmark qw(:all);

一些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 },
});
                 Rate       without ()       with ()    
without ()      3320053/s          --         -1%
with    ()      3338898/s          1%          --
这是基准测试的结果:

#!/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 },
});
                 Rate       without ()       with ()    
without ()      3320053/s          --         -1%
with    ()      3338898/s          1%          --
我想,如果应用程序使用数百个模块,每个模块有数百个不带括号调用的方法,这是否会增加很多速度差异


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

因为你可以。真正地我想。 由于Perl允许这么多,人们正在使用它。有时是好的,因为您能够以短序列编写非常复杂的内容,有时是坏的,因为它经常变得复杂(特别是对于Perl新手)


这也取决于你的程序做什么。差异应该只在编译时出现(我假设)。通常情况下,编译时间只是整个应用程序生命周期中的一小部分,在这一部分并不重要。

我不确定1%的时间差是否有意义,我怀疑您是否能够测量实际程序中的任何差异

有些人认为如果在方法调用的末尾没有
()
,看起来会更整洁。这就足够了。你也会看到它的函数

对我来说,当我想暗示“此处不需要参数”时,我会尝试这样做。主要是使用属性getter等


如果一个方法可以采用可选参数,而这些参数只是默认值,那么我宁愿不这样做,这样我就可以区分“无需参数”和“我没有提供参数,但可能有”。

1%的差异是系统噪声。两个版本编译成完全相同的字节码,因此它们之间不可能有系统性的区别。使用使代码更易于阅读的变量

如果您想查看它编译成什么,可以这样做:

perl -MO=Concise -E '$foo->bar()'

我认为你的测量有系统误差。当我运行代码时,
不带()
每次都比
带()
快。但是当我在
cmp中使用相同长度的字符串时,这些字符串
例如:

cmpthese(10_000_000, {
    'with    ()' => sub { $class->message() },
    'without ()' => sub { $class->message },
});
我得到了这些(相当预期的)结果:


因此,我认为这只是关于最佳实践。

如果它只是一个编译时,那么为什么会出现上述基准测试中运行时的差异。1%可能是由于系统上的其他原因造成的。我不确定我是否会过于依赖它。但这确实是一个公平的观点。使用括号是更好的练习,我完全同意这一点。如前所述,人们可能会以其他方式进行操作,因为他们可以。可读性比一些非常微小的性能优化(如果有的话)更重要。我将使用我认为更可读的代码。在实践中,这往往归结为它是否是一个访问器方法,或者它是否做了更实质性的事情。例如,
print$object->result,“\n”vs.
$object->接管世界()
B::Deparse也很有用:
perl-MO=Deparse,-p-E'$foo->bar()