2014-08-27 49 views
3

一些Perl书籍建议在调用类方法时使用括号,这有助于避免分析器猜测代码的意图。然而,几乎所有我见过的Perl代码(包括cpan上的模块)在调用没有参数的方法时很少使用括号。带有和不带圆括号的Perl调用方法

忽略这些括号是正常的,还是应该始终输入它们?

我写了一个小测试代码来测量调用有括号和不带括号的方法之间的差异,并且对于仅使用两种方法的类,实际上显示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%   -- 

如果应用程序使用数百个模块,每个模块有我想象数百种不带圆括号的方法,这是否会增加很多速度差异?

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

回答

1

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

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

+0

如果仅仅是编译时间,那么为什么这种运行时间的差异就像您看到上面的基准一样。 – daliaessam 2014-08-27 10:05:21

+0

1%可能是由系统上的其他原因造成的。不知道我是否会过多地指望这一点。但这确实是一个公平的观点。使用括号是更好的练习,我绝对同意这一点。如前所述,人们可能会这样做,因为他们可以。 – smnpl 2014-08-27 10:10:56

4

我不确定1%的时间差异是否有意义,我怀疑你能够衡量真实程序中的差异。

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

对我来说,当我想暗示“这里不需要任何参数”时,我尝试这样做。大多只是使用属性getters等。

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

+1

可读性比一些非常小的性能优化(如果有的话)更重要。我会用我认为让我的代码更具可读性的。在实践中,这往往归结为它是一种访问方法,还是它做了一些更重要的事情。例如。 'print $ object - > result,“\ n”;'vs'$ object - > take_over_the_world();' – Sobrique 2014-08-27 10:17:45

5

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

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

perl -MO=Concise -E '$foo->bar()' 
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%   -- 

所以我认为这只是有关的最佳实践。

相关问题