Class :: MethodMaker究竟做了什么?

时间:2008-09-15 10:26:10

标签: perl

我想知道调用通过Class :: MethodMaker创建的getter / setter时调用的确切序列是什么?

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

5 个答案:

答案 0 :(得分:2)

对于有关Class :: MethodMaker性能的问题,我没有简单的答案。如前所述,您可以使用调试器来了解幕后发生的情况。但是,我知道Class :: MethodMaker在安装时会生成巨大的数量的代码。这对我来说意味着三件事:

  1. 关于运行时,它可能可能在整个方法生成器的更快的一侧。为什么在安装时生成大量代码?
  2. 在您的磁盘上安装O(兆字节)代码!
  3. 在编译时可能会很慢,具体取决于为简单用例加载生成的代码的哪些部分。
  4. 你真的需要花几分钟思考你真正需要的东西。如果你想自动生成简单的访问器方法但是手写更复杂的东西,可以看看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”运行脚本;虽然期待很多输出!)。