2

我想知道调用通过 Class::MethodMaker 创建的 getter/setter 时发生的调用顺序到底是什么?

MethodMaker 定义的 getter/setter 比本地的(在模块中覆盖)要贵多少?

4

5 回答 5

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 错误。

于 2008-09-16T09:07:47.770 回答
1

这正是调试工具的用途:)

查看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 块,它们显然只在编译时调用,因此它们可能会稍微减慢脚本的编译速度,但随后的对象创建/访问器使用不受它的影响。

于 2008-09-15T12:23:55.060 回答
0

真正的问题是:重要吗?

它是另一个访问器生成模块。这些模块都具有速度/功能权衡。只需选择一个可以提供您需要的一切的产品。访问器不会成为应用程序的瓶颈。

于 2008-09-15T12:07:39.780 回答
0

@Leon Timmermans

我知道存在一些速度/功能折衷的事实,但想了解它的好坏程度?更好的是,如果我能获得具体的实现,以便更容易决定。

于 2008-09-15T12:19:20.143 回答
0

继我之前的回答之后,如果您想详细了解幕后发生的事情,请在调试器中运行脚本并启用跟踪模式(perl -d filename.pl,然后说“t”进行跟踪,然后说“r " 来运行脚本;虽然期待很多输出!)。

于 2008-09-15T15:18:43.533 回答