Class::MethodMaker によって作成された getter/setter が呼び出されたときに発生する一連の呼び出しを正確に知りたいですか?
MethodMaker によって定義された getter/setter は、ネイティブのもの (モジュールで上書きされる) よりもどれくらいコストがかかりますか?
Class::MethodMaker によって作成された getter/setter が呼び出されたときに発生する一連の呼び出しを正確に知りたいですか?
MethodMaker によって定義された getter/setter は、ネイティブのもの (モジュールで上書きされる) よりもどれくらいコストがかかりますか?
Class::MethodMaker のパフォーマンスに関するあなたの質問に対する簡単な答えはありません。前の回答で述べたように、デバッガーを使用して内部で何が起こっているかを調べることができます。しかし、Class::MethodMaker がインストール時に大量のコードを生成することは知っています。これは、私にとって3つの別々のことを示しています。
本当に必要なものについて考えるには、数分を費やす必要があります。単純なアクセサ メソッドを自動生成したいが、より複雑なものを手動で記述したい場合は、Class::Accessor::Fast を参照してください。または、可能な限り高速なアクセサー メソッドが必要な場合は、Class::XSAccessor を調査します。このメソッドは C/XS コードとして実行され、最速の Perl アクセサーよりも約 2 倍高速です。(注: 後者のモジュールは私が書いたものなので、これについては理解しておいてください。)
もう 1 つのコメント: アプリケーションのパッケージ化に PAR/PAR::Packer ツールキットを使用する場合は、Class::MethodMaker の大量のコードにより実行可能ファイルが大幅に大きくなり、初期起動が遅くなることに注意してください。時間。さらに、C::MethodMaker と PAR の間には既知の非互換性があります。しかし、これは PAR のバグと見なされる場合があります。
これはまさにデバッグツールの目的です:)
perldebugのドキュメント、特にプロファイリングのセクションを見てください。
特に、スクリプトを perl -dDProf filename.pl で実行すると、dprofpp ツール (Perl で配布) がレポートを作成できる tt.out ファイルが生成されます。
次の簡単なテスト スクリプトを使用しました。
#!/usr/bin/perl パッケージ Foo; 厳密に使用します。 Class::MethodMaker を使用 [ スカラー => ['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 名前 25.3 0.020 0.020 4 0.0050 0.0050 クラス::メソッドメーカー::定数::BEG の 25.3 0.020 0.029 12 0.0017 0.0025 クラス::メソッドメーカー::エンジン::BEGIN 12.6 0.010 0.010 1 0.0100 0.0100 ダイナローダー::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 クラス::メソッドメーカー::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 - - クラス::メソッドメーカー::ブートストラップ 0.00 - -0.000 1 - - 警告::BEGIN 0.00 - -0.000 1 - - 警告::インポート解除 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
最もコストのかかる 2 つの呼び出しは、Class::MethodMaker::Constants::BEGIN ブロックと Class::MethodMaker::Engine::BEGIN ブロックです。これらは明らかにコンパイル時にのみ呼び出されるため、スクリプトのコンパイルがわずかに遅くなる可能性があります。ただし、その後のオブジェクトの作成/アクセサーの使用は影響を受けません。
私の以前の回答に加えて、フードの下で何が起こっているのかを詳細に正確に確認したい場合は、トレースモードをオンにしてデバッガーでスクリプトを実行します (perl -d filename.pl、次に「t」と言ってトレースし、次に「r " スクリプトを実行しますが、大量の出力が予想されます!)。
@レオン・ティマーマンズ
速度と機能のトレードオフがあることは承知していますが、それがどれほど良いか悪いかを知りたいですか? そして、より簡単に決定できるように、具体的な実装を取得できれば、はるかに優れています。
本当の質問は次のとおりです。それは重要ですか?
これは、さらに別のアクセサー生成モジュールです。これらのモジュールにはすべて、速度と機能のトレードオフがあります。必要なものがすべて揃っているものを選んでください。アクセサーがアプリケーションのボトルネックになる可能性が高いわけではありません。