2008-09-15 45 views
2

我想知道當通過Class :: MethodMaker創建的getter/setter被調用時發生的調用序列究竟是什麼?Class :: MethodMaker究竟做了什麼?

MethodMaker定義的getter/setter比本地定義的(模塊中的覆蓋)要昂貴多少?

回答

2

對於您關於Class :: MethodMaker性能的問題,我沒有一個簡單的答案。作爲前面提到的答案,您可以使用調試器來了解底下發生了什麼。但是,我知道Class :: MethodMaker在安裝時會生成巨大的數量的代碼。這表明三個不同的東西給我:

  1. 關於運行時,它可能方法發電機的整體轉換的速度方面。爲什麼要在安裝時生成大量的代碼呢?
  2. 它在您的磁盤上安裝O(兆字節)的代碼!
  3. 它在編譯時可能會很慢,具體取決於爲簡單用例加載生成的代碼的哪些部分。

你真的需要花幾分鐘時間思考你真正需要什麼。如果你想自動生成簡單的訪問器方法,但手寫更復雜的東西,可以看看Class :: Accessor :: Fast。或者,如果您想要最快的訪問器方法,請調查Class :: XSAccessor,它的超簡單方法以C/XS代碼運行,並且速度是最快的Perl訪問器的兩倍。 (注意:我寫了後一個模塊,因此請帶上一點鹽。)

一個進一步的評論:如果您打算使用PAR/PAR :: Packer工具包打包您的應用程序,請注意Class :: MethodMaker的大量代碼會導致一個更大的可執行文件和更慢的初始啓動時間。此外,C :: MethodMaker和PAR之間存在已知的不兼容性。但這可能被認爲是一個PAR錯誤。

0

真正的問題是:它有關係嗎?

這是另一個訪問器生成模塊。這些模塊都具有速度/功能折衷。只需選擇一個提供您所需的一切。這不像訪問者可能成爲你的應用程序的瓶頸。

0

@Leon TIMMERMANS

我知道的事實,那就是一些速度/功能權衡,但想要得到的多好/壞的是它的想法?更好的是,如果我能得到具體的實現,以便更容易決定。

1

這正是調試工具是:)

看一看的perldebug文檔,特別是在分析部分。

特別是,使用perl -dDProf filename.pl運行腳本將生成一個tt.out文件,dprofpp工具(隨Perl分發)可以生成報告。

我用下面簡單的測試腳本:

 
#!/usr/bin/perl 

package Foo; 
use strict; 
use Class::MethodMaker [ scalar => ['bar'], new => ['new'] ]; 

package main; 
use strict; 

my $foo = new Foo; 
$foo->bar('baz'); 
print $foo->bar . "\n"; 

用Perl運行它-d:DProf methodmakertest.pl,然後用在輸出dprofpp了:

 
[[email protected]:~/tmp]$ dprofpp tmon.out 
Class::MethodMaker::scalar::scal0000 has 1 unstacked calls in outer 
Class::MethodMaker::Engine::new has 1 unstacked calls in outer 
AutoLoader::AUTOLOAD has -2 unstacked calls in outer 
Total Elapsed Time = 0.08894 Seconds 
    User+System Time = 0.07894 Seconds 
Exclusive Times 
%Time ExclSec CumulS #Calls sec/call Csec/c Name 
25.3 0.020 0.020  4 0.0050 0.0050 Class::MethodMaker::Constants::BEG 
              IN 
25.3 0.020 0.029  12 0.0017 0.0025 Class::MethodMaker::Engine::BEGIN 
12.6 0.010 0.010  1 0.0100 0.0100 DynaLoader::dl_load_file 
12.6 0.010 0.010  2 0.0050 0.0050 AutoLoader::AUTOLOAD 
12.6 0.010 0.010  14 0.0007 0.0007 Class::MethodMaker::V1Compat::reph 
              rase_prefix_option 
0.00 0.000 0.000  1 0.0000 0.0000 Class::MethodMaker::scalar::scal00 
              00 
0.00 0.000 0.000  1 0.0000 0.0000 Class::MethodMaker::Engine::new 
0.00  - -0.000  1  -  - DynaLoader::dl_undef_symbols 
0.00  - -0.000  1  -  - Class::MethodMaker::bootstrap 
0.00  - -0.000  1  -  - warnings::BEGIN 
0.00  - -0.000  1  -  - warnings::unimport 
0.00  - -0.000  1  -  - DynaLoader::dl_find_symbol 
0.00  - -0.000  1  -  - DynaLoader::dl_install_xsub 
0.00  - -0.000  1  -  - UNIVERSAL::VERSION 
0.00  - -0.000  1  -  - Foo::new 

兩個最昂貴調用是Class :: MethodMaker :: Constants :: BEGIN和Class :: MethodMaker :: Engine :: BEGIN塊,它們顯然僅在編譯時調用,因此它們可能會稍微減慢腳本的編譯速度,但後續的對象創建/訪問者的使用不受它的影響。

0

除了我之前的回答,如果您想詳細瞭解底層的情況,請在調試器中以跟蹤模式運行腳本(perl -d filename.pl,然後說「t」跟蹤,然後用「r」來運行腳本;雖然期望很多輸出!)。