我想知道调用通过 Class::MethodMaker 创建的 getter/setter 时发生的调用顺序到底是什么?
MethodMaker 定义的 getter/setter 比本地的(在模块中覆盖)要贵多少?
我想知道调用通过 Class::MethodMaker 创建的 getter/setter 时发生的调用顺序到底是什么?
MethodMaker 定义的 getter/setter 比本地的(在模块中覆盖)要贵多少?
对于您关于 Class::MethodMaker 性能的问题,我没有简单的答案。正如前面提到的答案,您可以使用调试器来找出幕后发生的事情。但是,我知道 Class::MethodMaker在安装时会生成大量代码。这将向我表明三件不同的事情:
你真的需要花几分钟来思考你真正需要什么。如果您想要自动生成简单的访问器方法,但要手动编写更复杂的东西,可以查看 Class::Accessor::Fast。或者,如果您想要最快的访问器方法,请研究 Class::XSAccessor,它的超简单方法作为 C/XS 代码运行,并且速度大约是最快的 Perl 访问器的两倍。(注意:我写了后一个模块,所以对此持保留态度。)
进一步的评论:如果您打算使用 PAR/PAR::Packer 工具包来打包您的应用程序,请注意 Class::MethodMaker 的大量代码会导致可执行文件大得多并且初始启动速度较慢时间。此外,C::MethodMaker 和 PAR 之间存在已知的不兼容性。但这可能被认为是一个 PAR 错误。
这正是调试工具的用途:)
查看perldebug文档,尤其是关于分析的部分。
特别是,使用 perl -dDProf filename.pl 运行脚本将生成一个 tt.out 文件,dprofpp 工具(随 Perl 分发)可以从中生成报告。
我使用了以下简单的测试脚本:
#!/usr/bin/perl 包Foo; 使用严格; 使用 Class::MethodMaker [ scalar => ['bar'], new => ['new'] ]; 主包; 使用严格; 我的 $foo = 新的 Foo; $foo->bar('baz'); 打印 $foo->bar 。"\n";
使用 perl -d:DProf methodmakertest.pl 运行它,然后在输出上使用 dprofpp 给出:
[davidp@supernova:~/tmp]$ dprofpp tmon.out Class::MethodMaker::scalar::scal0000 在外部有 1 个未堆叠调用 Class::MethodMaker::Engine::new 在外部有 1 个未堆叠调用 AutoLoader::AUTOLOAD 在外部有 -2 个未堆叠调用 总经过时间 = 0.08894 秒 用户+系统时间 = 0.07894 秒 独家时间 %Time ExclSec CumulS #Calls sec/call Csec/c Name 25.3 0.020 0.020 4 0.0050 0.0050 类::MethodMaker::Constants::BEG 在 25.3 0.020 0.029 12 0.0017 0.0025 类::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 自动加载器::AUTOLOAD 12.6 0.010 0.010 14 0.0007 0.0007 类::MethodMaker::V1Compat::reph rase_prefix_option 0.00 0.000 0.000 1 0.0000 0.0000 类::MethodMaker::标量::scal00 00 0.00 0.000 0.000 1 0.0000 0.0000 类::MethodMaker::Engine::new 0.00 - -0.000 1 - - DynaLoader::dl_undef_symbols 0.00 - -0.000 1 - - 类::MethodMaker::bootstrap 0.00 - -0.000 1 - - 警告::BEGIN 0.00 - -0.000 1 - - 警告::unimport 0.00 - -0.000 1 - - DynaLoader::dl_find_symbol 0.00 - -0.000 1 - - DynaLoader::dl_install_xsub 0.00 - -0.000 1 - - 通用::版本 0.00 - -0.000 1 - - Foo::new
两个最昂贵的调用是 Class::MethodMaker::Constants::BEGIN 和 Class::MethodMaker::Engine::BEGIN 块,它们显然只在编译时调用,因此它们可能会稍微减慢脚本的编译速度,但随后的对象创建/访问器使用不受它的影响。
真正的问题是:重要吗?
它是另一个访问器生成模块。这些模块都具有速度/功能权衡。只需选择一个可以提供您需要的一切的产品。访问器不会成为应用程序的瓶颈。
@Leon Timmermans
我知道存在一些速度/功能折衷的事实,但想了解它的好坏程度?更好的是,如果我能获得具体的实现,以便更容易决定。
继我之前的回答之后,如果您想详细了解幕后发生的事情,请在调试器中运行脚本并启用跟踪模式(perl -d filename.pl,然后说“t”进行跟踪,然后说“r " 来运行脚本;虽然期待很多输出!)。