2009-03-08 10 views
0

パフォーマンスとデザインの賢明さと賢明さカスタマイズフック:仮想関数またはイベント?

密封クラスとイベントまたは仮想関数を持つ抽象クラスを使用していますか?

唯一の問題は、仮想メソッドは、答えはイエスであるよりも、イベントを呼び出すよりも高速であるかどうかである場合、彼らは正確に...似た代替案のようには見えません

+1

あなたが比較している選択肢についてより具体的に説明する必要があります。 – harpo

答えて

5

抽象クラス、継承、およびイベントサブスクリプションに関して、パフォーマンスについてあまり心配するべきではありません。これらは、開発をより簡単にするように設計された言語構造です。&それらは実際に完全に念頭に置いたパフォーマンスで設計されていません。

パフォーマンスに関しては、もっと気になることがあります。いくつかのことが頭に浮かぶ:

  • Boxing & unboxingは - あなたは、反復または反復的なタスクの多くをやっている場合は、あまりにも多くのボクシング&アンボクシングのオブジェクトを避けるようにしてください。
  • Reference TypesValue Types - "structs"として作成されたオブジェクトは値で保存されます。つまり、オブジェクトの値全体がメモリに送られたときに渡されます。これはより高価になる可能性がありますが、その寿命はより決定的であるため、通常は特定のスコープ内にのみ存在するという利点があります。 「クラス」として作成されたオブジェクトは、参照によって格納されます。コードを介して参照オブジェクトを送信するときは、参照をオブジェクトに送信するだけで、移動するメモリが少なくなります。欠点は、ヒープに割り当てられているため、メモリの寿命が短くなるということです。
  • Subscribing/unsubscribing to events - これは単なる開発ミスのようなパフォーマンス上の問題ではありません。すべてのイベントが登録解除されない限り、オブジェクトはGCされません。サブスクリプションを開いたままにすると、オブジェクトはメモリに永久に残り、メモリリークが発生する可能性があります。この問題を回避するには、マイクロソフトでWeakEvent patternのドキュメントを参照してください。

Microsoft's MSDN documentation on Performanceもお読みください。これは、.NETでの実際のパフォーマンスの低下を理解する上で参考になります。密封された&抽象クラスとイベントハンドラは、通常パフォーマンス上の問題ではありません。

一般的に、コード構造は、心配することがより重要です。データをどのように扱っているのか、使用するパターンが重いために実行することができます。

1

...イベントに1人のリスナーが存在しますしかし、ほんのわずかです。