Class :: MethodMaker到底做什么?
我想知道调用通过Class :: MethodMaker创建的getter / setter时发生的调用顺序到底是什么?
MethodMaker定义的getter / setter方法比本地方法(在模块中覆盖)要贵多少?
解决方案
回答
真正的问题是:这有关系吗?
这是另一个访问器生成模块。这些模块都需要在速度/功能之间进行权衡。只需选择一个可提供我们所需的一切。存取器可能不会成为我们应用程序的瓶颈。
回答
@莱昂·蒂默曼斯(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给出:
[davidp@supernova:~/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")。 "来运行脚本;尽管期望会有很多输出!)。
回答
对于我们有关Class :: MethodMaker性能的问题,我没有一个简单的答案。作为前面提到的答案,我们可以使用调试器来了解实际情况。但是,我知道Class :: MethodMaker在安装时会生成大量代码。这将向我表明三件事:
- 关于运行时,它可能在整个方法生成器中更快。为什么要在安装时生成大量代码?
- 它会在磁盘上安装O(M)的代码!
- 它可能在编译时很慢,具体取决于为简单用例加载生成的代码的哪些部分。
我们确实需要花几分钟时间来思考自己真正需要的东西。如果我们想自动生成简单的访问器方法,但要手工编写更复杂的内容,请查看Class :: Accessor :: Fast。或者,如果我们想要最快的访问器方法,请研究Class :: XSAccessor,其超简单方法以C / XS代码运行,并且是最快的Perl访问器的两倍。 (注意:我写了后面的模块,所以要加一点盐。)
进一步说明:如果要使用PAR / PAR :: Packer工具包来打包应用程序,请注意,Class :: MethodMaker的大量代码会导致可执行文件大得多,并且启动速度较慢时间。此外,C :: MethodMaker与PAR之间存在已知的不兼容性。但这可能被认为是PAR错误。