質問

Class::MethodMaker を通じて作成されたゲッター/セッターが呼び出されるときに発生する一連の呼び出しを正確に知りたいのですが?

MethodMaker によって定義されたゲッター/セッターは、ネイティブのもの (モジュール内で上書きされる) よりどれくらいコストがかかりますか?

役に立ちましたか?

解決

Class::MethodMaker のパフォーマンスに関する質問に対する簡単な答えはありません。前の回答で述べたように、デバッガーを使用して内部で何が起こっているかを確認できます。ただし、Class::MethodMaker が生成することは知っています。 巨大な インストール時のコードの量。これは私にとって、次の 3 つの異なることを示しています。

  1. 実行時間に関しては、 おそらく 多数のメソッド ジェネレーターの中でも高速な方です。それ以外の場合、なぜインストール時に大量のコードを生成するのでしょうか?
  2. O(メガバイト)のコードがディスクにインストールされます。
  3. 単純な使用例で生成されたコードのどの部分がロードされるかによっては、コンパイル時に遅くなる可能性があります。

本当に必要なものについて考えるには、数分を費やす必要があります。単純なアクセサー メソッドを自動生成したいが、より複雑なものは手動で記述したい場合は、Class::Accessor::Fast を参照してください。または、可能な限り高速なアクセサー メソッドが必要な場合は、Class::XSAccessor を調べてください。この非常に単純なメソッドは C/XS コードとして実行され、最速の Perl アクセサーの約 2 倍高速です。(注記:後者のモジュールは私が書いたものなので、話半分に聞いてください。)

さらにコメントをもう 1 つ:アプリケーションのパッケージ化に PAR/PAR::Packer ツールキットを使用する場合は、Class::MethodMaker のコードが大量になるため、実行可能ファイルが大幅に大きくなり、初期起動時間が遅くなることに注意してください。さらに、C::MethodMaker と PAR の間には非互換性があることが知られています。しかし、それは PAR のバグであると考えられるかもしれません。

他のヒント

これはまさにデバッグ ツールの目的です:)

を見てください。 パールデバグ ドキュメント、特にプロファイリングに関するセクション。

特に、perl -dDProf filename.pl を指定してスクリプトを実行すると、dprofpp ツール (Perl とともに配布) でレポートを作成できる tt.out ファイルが生成されます。

次の簡単なテスト スクリプトを使用しました。

#!/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

最も負荷の高い 2 つの呼び出しは、Class::MethodMaker::Constants::BEGIN ブロックと Class::MethodMaker::Engine::BEGIN ブロックです。これらは明らかにコンパイル時にのみ呼び出されるため、スクリプトのコンパイルがわずかに遅くなる可能性があります。ただし、その後のオブジェクトの作成やアクセサーの使用は影響を受けません。

本当の質問は次のとおりです。関係ありますか?

これは、さらに別のアクセサー生成モジュールです。これらのモジュールはすべて、速度と機能のトレードオフがあります。必要なものがすべて揃っているものを選んでください。アクセサーがアプリケーションのボトルネックになる可能性が高いわけではありません。

@レオン・ティマーマンズ

速度と機能性のトレードオフがあるという事実は承知していますが、それがどの程度良いか悪いかを知りたいですか?さらに、実装の具体的な情報を得ることができれば、決定が容易になります。

私の前の回答に加えて、内部で何が起こっているのかを詳しく知りたい場合は、トレースモードをオンにしてデバッガでスクリプトを実行します(perl -d filename.pl、次に「t」と言ってトレースし、次に「r」と言います) " スクリプトを実行します。ただし、大量の出力が期待されます!)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top