2011-01-03 13 views
8

私は、典型的なAOPタスクに関するいくつかのパフォーマンステストを少し探してきました。私は何も見つけることができていない、あなたが私を助けることができる? 私のプロジェクトでは高すぎるかもしれませんが、私はCastle、Unity、そしておそらくPostSharpについて考えています。AOPパフォーマンスオーバーヘッド

+0

パフォーマンステストを定義します。コンパイル時間またはランタイム? – TomTom

+0

PostSharpは実際にあなたのコードをあなたのコードに織り込みます。実際のAoPオーバーヘッドは含まれていません。 – Amy

答えて

4

私は定量的な比較も見ていないので、この回答はおそらく完全ではありません。

CastleまたはUnityのパフォーマンスをPostSharpと比較するのは難しい - CastleとUnityは動的プロキシ処理でruntime weavingを使用し、PostSharpはオーバーヘッドをat compile stageに追加します。パフォーマンスが重要な場合は、PostSharpのようなコンパイルされたソリューションが常に優れています。実行時にAOPプロキシを生成することは、動的にILコードを生成し、重反射を使用することを意味します。

パフォーマンステストでは、同じテクニックを使用してソリューションを比較する必要があります.Cast Dynamic ProxyとUnity Interceptionプロキシの実装を比較することができます。

私は以前の井戸についてはわかりませんが、後者の場合は、透過プロキシ(MarshalByRefObject)、インターフェイスプロキシとサブクラス化プロキシの3種類のシナリオがあります。それぞれ独自の使用シナリオセットとパフォーマンス上のオーバーヘッド。私が読んだことから、透過プロキシはひどく遅く、AOPシナリオでは使用すべきではありません。インターフェイスとサブタイプのプロキシは、その場でILを生成しますが、これはCastle DPと同じですので、違いが大きくないはずです(ですが、ここでは定量結果はありません)

1

軽量AOPツールをお探しの場合は、記事「動的デコレータを使用したオブジェクトにアスペクトを追加する」(http://www.codeproject.com/KB/architecture/aspectddecorator.aspx)があります。それは薄く柔軟です。

これは、設計時にクラスにアスペクトを追加するのではなく、実行時にアスペクトをオブジェクトに追加する方法を説明しています。この方法の利点は、オブジェクトを使用するときにアスペクトが必要かどうかを判断することです。

今日のAOPツールのほとんどは、クラス設計時にクラスレベルでアスペクトを定義します。また、クラスのオブジェクトを使用するときに柔軟性がありません。

0

あなたのプロジェクトでパフォーマンスが不安定な場合は、AOPフレームワークのオーバーヘッドが使用法に準拠していない場合がほとんどないため、パフォーマンス指向の使用を確認してください。

たとえば、DynamicProxyを使用している場合、リフレクションまたはProceed()メソッドを使用してバッキング処理を呼び出すことができます。これは、異なるパフォーマンスを変更します。

もう1つの例:AOPフレームワークのほとんどは、あなたの「アドバイス」にMethodInfoを与えます。 GetMethodFromHandleは非常に並行処理(ロック付き辞書アクセス)で非常に悪い可能性があるため、このメタデータをどのように取得するかによってパフォーマンスが変わる可能性があります。

覚えておくべきもう1つの重要な点は、AOPフレームワークであまりにも多くの情報(argument、methodinfo、...)を準備する必要があるため、Adviceメソッドに適応オーバーラップを使用することです(パフォーマンスオーバーヘッド)。残念なことに、インターセプトが完璧だった場合、パフォーマンスアドバイザンスイベントを実装するための優れたユーザーエンドインターフェースはありません。

詳細については、when-is-aop-code-executedの投稿で、AOPフレームワークのパフォーマンスに関する問題についてのフィードバックをお寄せください。