我想知道调用通过Class :: MethodMaker创建的getter / setter时调用的确切序列是什么?
MethodMaker定义的getter / setter比本机定义的要多得多(在模块中覆盖)?
答案 0 :(得分:2)
对于有关Class :: MethodMaker性能的问题,我没有简单的答案。如前所述,您可以使用调试器来了解幕后发生的情况。但是,我知道Class :: MethodMaker在安装时会生成巨大的数量的代码。这对我来说意味着三件事:
你真的需要花几分钟思考你真正需要的东西。如果你想自动生成简单的访问器方法但是手写更复杂的东西,可以看看Class :: Accessor :: Fast。或者,如果您想要最快的访问器方法,请研究Class :: XSAccessor,其超简单方法作为C / XS代码运行,并且速度大约是最快的Perl访问器的两倍。 (注意:我写了后一个模块,所以带上一粒盐。)
还有一条评论:如果您打算使用PAR / PAR :: Packer工具包打包应用程序,请注意Class :: MethodMaker的大量代码会导致可执行文件大得多,初始化速度会变慢启动时间。另外,C :: MethodMaker和PAR之间存在已知的不兼容性。但这可能被视为PAR错误。
答案 1 :(得分: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给出:
[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块,它们显然只在编译时被调用,所以它们可能会减慢你的编译速度脚本略有不同,但后续的对象创建/访问者使用不受其影响。
答案 2 :(得分:0)
真正的问题是:这有关系吗?
这是另一个访问者生成模块。这些模块都具有速度/功能权衡。只需挑选一个提供您所需的一切。它并不像访问者可能成为您应用程序的瓶颈。
答案 3 :(得分:0)
@Leon Timmermans
我知道有一些速度/功能权衡,但想知道它有多好/坏?更好的是,如果我可以获得具体的实现,以便更容易决定。
答案 4 :(得分:0)
继我之前的回答之后,如果你想详细了解底层发生了什么,请在调试器中运行脚本并打开跟踪模式(perl -d filename.pl,然后说“t”跟踪,然后“r”运行脚本;虽然期待很多输出!)。