Class :: MethodMaker到底做什么?

时间:2020-03-05 18:53:14  来源:igfitidea点击:

我想知道调用通过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错误。