我想知道當通過Class :: MethodMaker創建的getter/setter被調用時發生的調用序列究竟是什麼?Class :: MethodMaker究竟做了什麼?
MethodMaker定義的getter/setter比本地定義的(模塊中的覆蓋)要昂貴多少?
我想知道當通過Class :: MethodMaker創建的getter/setter被調用時發生的調用序列究竟是什麼?Class :: MethodMaker究竟做了什麼?
MethodMaker定義的getter/setter比本地定義的(模塊中的覆蓋)要昂貴多少?
對於您關於Class :: MethodMaker性能的問題,我沒有一個簡單的答案。作爲前面提到的答案,您可以使用調試器來了解底下發生了什麼。但是,我知道Class :: MethodMaker在安裝時會生成巨大的數量的代碼。這表明三個不同的東西給我:
你真的需要花幾分鐘時間思考你真正需要什麼。如果你想自動生成簡單的訪問器方法,但手寫更復雜的東西,可以看看Class :: Accessor :: Fast。或者,如果您想要最快的訪問器方法,請調查Class :: XSAccessor,它的超簡單方法以C/XS代碼運行,並且速度是最快的Perl訪問器的兩倍。 (注意:我寫了後一個模塊,因此請帶上一點鹽。)
一個進一步的評論:如果您打算使用PAR/PAR :: Packer工具包打包您的應用程序,請注意Class :: MethodMaker的大量代碼會導致一個更大的可執行文件和更慢的初始啓動時間。此外,C :: MethodMaker和PAR之間存在已知的不兼容性。但這可能被認爲是一個PAR錯誤。
真正的問題是:它有關係嗎?
這是另一個訪問器生成模塊。這些模塊都具有速度/功能折衷。只需選擇一個提供您所需的一切。這不像訪問者可能成爲你的應用程序的瓶頸。
@Leon TIMMERMANS
我知道的事實,那就是一些速度/功能權衡,但想要得到的多好/壞的是它的想法?更好的是,如果我能得到具體的實現,以便更容易決定。
這正是調試工具是:)
看一看的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塊,它們顯然僅在編譯時調用,因此它們可能會稍微減慢腳本的編譯速度,但後續的對象創建/訪問者的使用不受它的影響。
除了我之前的回答,如果您想詳細瞭解底層的情況,請在調試器中以跟蹤模式運行腳本(perl -d filename.pl,然後說「t」跟蹤,然後用「r」來運行腳本;雖然期望很多輸出!)。