web-dev-qa-db-ja.com

AOPの使用によるパフォーマンスへの影響

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

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

私の質問、aop(具体的には、スプリングaop)の使用によって導入されたパフォーマンスの問題に遭遇しましたか?

42
LiorH

AOPのコントロールがあるである限り、効率的だと思います。とにかくパフォーマンスの問題があったので、自分の推論では完全には制御できませんでした;)これは主に、アスペクトを書く人がfullすべての理解otherを持っていることが重要であるためです=システムの側面とそれらの相互関係。 「スマート」なことを始めると、Jiffyで自分を出し抜くことができます。システムの小さな部分だけを見る多くの人がいる大規模なプロジェクトでスマートなことを行うと、パフォーマンスの面で非常に危険な場合があります。このアドバイスは、おそらくAOPなしでも適用されますが、AOPを使用すると、いくつかの本当のエレガントな方法で足を撃つことができます。

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

しかし、あなたが制御できることを考えると、AOPの唯一の本当の問題は、デバッグへの影響です。

34
krosenvold

パフォーマンスが問題になる場合は、 AspectJ を使用して大きな効果を上げています。

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

27
Nathan

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

非常にタイトなループで使用される呼び出しにそれを使用する場合、パフォーマンスに大きな影響を与えるopportunityがあります。リクエストごとに1回セキュリティをチェックし、さまざまなものをキャッシュするためだけに使用する場合、それがどの程度重要であるかはわかりませんが、そのため、プロファイルとベンチマークyour appを実行する必要があります。

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

19
Jon Skeet

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

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

7
cliff.meyers

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

実際には、AOPフレームワークは3種類のオーバーヘッドを導入できます。

  • 火の時間
  • 迎撃メカニック
  • 消費者統合(アドバイスを開発する方法)

詳細については、 when-is-aop-code-executed を参照してください。

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

AOPフレームワーク(分野横断的な懸念をハードカップリングする)がなければ、ボックス化/ボックス化解除および反映なしに、推定アドバイス(各処理専用)を簡単に開発できます。

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

私は、3つのことに集中して欠けているニーズのほとんどに対応するために開発しました。

  • ユーザーフレンドリー(軽量、習得が容易)
  • 透過的(含める破壊コードなし)
  • 効率的(ボクシング/アンボクシングなし、名目上のユーザーコードへの反映なし、優れた遮断メカニズム)

私のオープンソースプロジェクトはここにあります: Puresharp API .net 4.5.2 + 以前は NConcern .NET AOP Framework

1
Tony THONG

アスペクトに1つのフレームワークを使用している場合、パフォーマンスの問題が発生する可能性があります。次に、1つのフレームワークの上に抽象化を作成し、アスペクトの処理がフレームワークから行われる場合、パフォーマンスの問題に関連する問題の原因を見つけるのは非常に困難です。あなたが本当にパフォーマンスに関心があり、小さなタイムスライスにもっと関心があるなら、私は独自の側面を書くことをお勧めします。

0

必要なときに実行時にオブジェクトにアスペクトを追加するAOPツールについて考えたことがありますか? .net "Dynamic Decoratorを使用してオブジェクトにアスペクトを追加する"(http://www.codeproject.com/KB/architecture/aspectddecorator.aspx)の1つがあります。私はあなたがJavaに似たものを書くことができると思います。

0
Gary

データベースをトランザクション管理するために、現在のプロジェクトのバッチプロセスでSpring AOPを使用しました。

最初は、パフォーマンスの問題はないと考えられていましたが、データベースを何千回も呼び出すという方程式は理解していませんでした。 aopの1つの側面の呼び出しはパフォーマンスに大きな影響を与えませんが、数千を掛けると、これらの余分なメソッド呼び出しのために、新しいシステムは古いシステムよりも悪いことがわかります。

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

0
Richard