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

时间:2014-08-27 09:50:20

标签: 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 },
});

这是基准测试的结果:

                 Rate       without ()       with ()    
without ()      3320053/s          --         -1%
with    ()      3338898/s          1%          --

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

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

4 个答案:

答案 0 :(得分:6)

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

如果你想看看它编写的是什么,你可以这样做:

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

答案 1 :(得分:4)

我不确定1%的时差是否有意义,我怀疑你是否能够衡量真实节目中的任何差异。

有些人认为在方法调用结束时它没有()看起来更整洁。这就足够了。你也会看到它的功能。

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

如果一个方法可以采用可选参数并且它们只是默认,那么我不愿意,所以我可以区分“不需要参数”和“我没有提供参数,但可能有”。

答案 2 :(得分:2)

我认为您的测量存在系统误差。当我运行您的代码时,without ()每次都会击败with ()。但是当我在cmpthese中使用相同长度的字符串时,例如:

cmpthese(10_000_000, {
    'with    ()' => sub { $class->message() },
    'without ()' => sub { $class->message },
});

我得到了这些(相当期待的)结果:

                Rate with    () without ()
with    () 3412969/s         --        -1%
without () 3460208/s         1%         --

                Rate without () with    ()
without () 2994012/s         --        -0%
with    () 3003003/s         0%         --

                Rate without () with    ()
without () 3278689/s         --        -1%
with    () 3300330/s         1%         --

                Rate with    () without ()
with    () 3039514/s         --        -2%
without () 3105590/s         2%         --

                Rate without () with    ()
without () 3267974/s         --        -3%
with    () 3378378/s         3%         --

所以我认为它只是关于最佳实践。

答案 3 :(得分:1)

因为你可以。真。我认为。 由于Perl允许这么多,人们正在使用它。有时为了好,因为你能够在短序列中编写非常复杂的东西,有时甚至更糟糕,因为它经常变得复杂(特别是对于刚接触Perl的人)。

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