2014-01-28 28 views
1

假設我有兩個包定義(兩者都是perl類和對象)Perl:長包名稱會影響解析性能嗎?

package FooRecord; 

package FooBarHelloWorldRecord; 

。 當上述類的實例訪問其方法時,是否會有性能差異? 我建議「長包名稱」會導致性能差異,因爲perl在方法解析過程中對字符串進行比較。

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

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

由於將在上述方法調用,第一個(由於較短的名稱)將表現出比第二包名稱的方法調用更好的性能名稱解析。

猜測:perl是否不保留包名稱的哈希值並與它們進行比較(內部)?

+2

如果長包名是你最糟糕的性能問題,你沒有性能問題。 – cjm

回答

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% -- 

個人,這不是一種方法,我會選擇來優化。我通常喜歡更長,更具描述性的類名。

+0

唯一的原因是顯而易見的區別是代碼幾乎沒有什麼*除*名稱解析。 – cjm

+1

如果您檢查Class :: Tiny文檔(和源代碼),您會發現這些示例實際上做的不僅僅是名稱解析。例如,它們是祝福hashref,並做一些參數處理(儘管我沒有向構造函數傳遞任何附加參數 - 參數處理仍然存在於Class :: Tiny :: Object :: new中)等等 – tobyink