質問

アプリケーションの横断的な側面にスプリングaopを使用し始めました(現時点ではセキュリティとキャッシュ)。

私のマネージャーは、このテクノロジーのパフォーマンスへの影響について心配していますが、メリットを完全に理解しています。

私の質問、aop(特にspring aop)の使用によって導入されたパフォーマンスの問題に遭遇しましたか?

役に立ちましたか?

解決

AOPを制御している限り、効率的だと思います。とにかくパフォーマンスの問題があったので、独自の推論では完全に制御できませんでした;)これは主に、アスペクトを書く人がすべてのその他を完全に理解していることが重要だからです。 >システムの側面とそれらの相互関係。 「スマート」を始めたらあなたは一瞬で自分を裏切ることができるもの。システムのごく一部しか見ない多くの人々と大規模なプロジェクトでスマートなことをすることは、パフォーマンス面で非常に危険です。このアドバイスはおそらくAOPなしでも当てはまりますが、AOPを使用すると、いくつかの本当にエレガントな方法で自分自身を撃つことができます。

Springはスコープ操作にもプロキシを使用し、それは望ましくないパフォーマンスの損失が発生しやすい領域です。

しかし、あなたがコントロールできることを考えると、AOPの唯一の本当の問題点はデバッグへの影響です。

他のヒント

パフォーマンスが懸念される場合は、 AspectJ を使用して非常に効果的です。

バイトコードウィービングを使用しているため(コンパイル時間とランタイムが大きく異なる)、これは最速のAOPフレームワークの1つです。参照: AOPベンチマーク

使用したときは使用しませんでしたが、私のアプリケーションはあなたのアプリケーションではありません。

非常にタイトなループで使用される呼び出しに使用すると、パフォーマンスが大幅に低下する機会があります。リクエストごとに一度セキュリティをチェックし、さまざまなものをキャッシュするために使用される場合、それが重要である可能性がどのように見えるかわかりません-しかし、それはあなたがあなたのアプリをプロファイルし、ベンチマークする必要がある理由です。

「アプリで測定する」ことを認識しています。おそらくあなたが探していた答えではありませんが、おそらくあなたが得るだろうと推測したものかもしれません:)

プロキシベースのAOPを使用している場合、適用されるアスペクトごとに1つの追加のJavaメソッド呼び出しについて話します。パフォーマンスへの影響はごくわずかです。唯一の本当の懸念はプロキシの作成ですが、これは通常、アプリケーションの起動時に一度だけ発生します。 SpringSourceブログにはこれに関する素晴らしい投稿があります:

http://blog.springsource.com / 2007/07/19 / debunking-myths-proxies-impact-performance /

理論上、AOPを使用してハードカップリングでできることをすれば、何も織り込まない限り、パフォーマンスの問題、オーバーヘッド、余分なメソッド呼び出しはありません。 AOPフレームワークは、ハードカップリングを削除し、横断的な懸念を分解する方法を提供します。

実際には、AOPフレームワークでは3種類のオーバーヘッドが発生する可能性があります:

  • ファイアタイム
  • 傍受の仕組み
  • 消費者の統合(アドバイスを作成する方法)

詳細については、 when-is-aop-code-実行

トランスバーサルコードはボクシング/アンボクシングとリフレクション(パフォーマンスの観点からは高価)の誘惑であるため、アドバイスの実装方法に注意してください。

AOPフレームワーク(横断的関心事とのハードカップリング)がなければ、ボックス化/アンボックス化およびリフレクションなしで、簡単な推定アドバイス(各治療専用)を開発できます。

ほとんどのAOPフレームワークは、完全なボクシング/アンボクシングとリフレクションを回避する方法を提供していないことを知っておく必要があります。

私は、不足しているニーズのほとんどに対応するために3つのことに集中するものを開発しました:

  • ユーザーフレンドリー(軽量、使いやすい)
  • 透明(含まれる破損コードなし)
  • 効率的(ボックス化/ボックス化解除なし、名目上のユーザーコードへの反映なし、良好なインターセプトメカニック)

ここで私のオープンソースプロジェクトを見つけることができます: Puresharp API .net 4.5.2+ 以前< a href = "https://github.com/Virtuoze/NConcern" rel = "nofollow noreferrer"> NConcern .NET AOPフレームワーク

必要なときに実行時にオブジェクトにアスペクトを追加するAOPツールについて考えたことはありますか? .netには「動的デコレータを使用してオブジェクトにアスペクトを追加」というものがあります。 (http://www.codeproject.com/KB/architecture/aspectddecorator.aspx)。 Java用の似たようなものを作成できると思います。

アスペクトにあるフレームワークを使用している場合、パフォーマンスの問題が発生する可能性があります。次に、あるフレームワークの上に抽象化を作成し、フレームワークからアスペクトの処理を行う場合、パフォーマンスの問題 。パフォーマンスと小さなタイムスライスの懸念が本当にある場合は、独自の側面を作成することをお勧めします。車輪を再発明したい人はいませんが、いつかはそれを改善することが最善です。 >

iは、現在のプロジェクトのバッチプロセスでspring AOPを使用してデータベースをトランザクション管理しています。

最初は、パフォーマンスの問題はないと考えられていましたが、データベースを何千回と呼ぶ方程式は考えませんでした。 aopでの1つのアスペクト呼び出しはパフォーマンスにそれほど影響しませんが、それを数千倍すると、これらの余分なメソッド呼び出しのために新しいシステムが古いシステムよりも悪化したことがわかります。

aopは使用に最適なシステムであると思いますが、アプリケーションに追加されるメソッド呼び出しの数に注意してください

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