質問
Class::MethodMaker を通じて作成されたゲッター/セッターが呼び出されるときに発生する一連の呼び出しを正確に知りたいのですが?
MethodMaker によって定義されたゲッター/セッターは、ネイティブのもの (モジュール内で上書きされる) よりどれくらいコストがかかりますか?
解決
Class::MethodMaker のパフォーマンスに関する質問に対する簡単な答えはありません。前の回答で述べたように、デバッガーを使用して内部で何が起こっているかを確認できます。ただし、Class::MethodMaker が生成することは知っています。 巨大な インストール時のコードの量。これは私にとって、次の 3 つの異なることを示しています。
- 実行時間に関しては、 おそらく 多数のメソッド ジェネレーターの中でも高速な方です。それ以外の場合、なぜインストール時に大量のコードを生成するのでしょうか?
- O(メガバイト)のコードがディスクにインストールされます。
- 単純な使用例で生成されたコードのどの部分がロードされるかによっては、コンパイル時に遅くなる可能性があります。
本当に必要なものについて考えるには、数分を費やす必要があります。単純なアクセサー メソッドを自動生成したいが、より複雑なものは手動で記述したい場合は、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」と言います) " スクリプトを実行します。ただし、大量の出力が期待されます!)。