Perl:长包名会影响分辨率的性能吗?

时间:2014-01-28 14:23:33

标签: performance perl package

假设我定义了两个包(并且都是perl类和对象)

package FooRecord;

package FooBarHelloWorldRecord;

。 当上述类的实例访问其方法时,是否会有性能差异? 我建议“long package name”会导致性能差异,因为perl会在方法解析过程中对名称进行字符串比较。

my $fooRecord = new FooRecord();  
$fooRecord->getFooData();

my $fooWorldRecord = new FooBarHelloWorldRecord();  
$fooWorldRecord->getWorldData();

由于上述方法调用中将存在名称解析,因此第一个(由于名称较短)将表现出比第二个包名称方法调用更好的性能。

推测:perl是否不保留包名的哈希值并与它们进行比较(内部)?

1 个答案:

答案 0 :(得分:3)

是的,确实有所作为:

use v5.14;
use warnings;
use Benchmark 'cmpthese';

package Foo {
   use Class::Tiny;
}

package FooButMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchLonger {
   use Class::Tiny;
}

package FooBut::So::So::So::So::So::So::So::So::Much::Deeper {
   use Class::Tiny;
}

cmpthese -1, {
  'short' => q{ Foo->new },
  'long'  => q{ FooButMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchLonger->new },
  'deep'  => q{ FooBut::So::So::So::So::So::So::So::So::Much::Deeper->new },
}

__END__
         Rate  deep  long short
deep  45510/s    --  -12%  -19%
long  51692/s   14%    --   -8%
short 56366/s   24%    9%    --

就个人而言,这不是我选择优化的方式。我通常喜欢更长,更具描述性的类名。