TOPシステム開発> AOPメソッド実行の処理
パフォーマンス徹底比較!! Seasar2 VS Spring
パフォーマンス徹底比較!! Seasar2 VS Spring

第4回:AOP機能のパフォーマンス比較
著者:株式会社電通国際情報サービス  比嘉 康雄
         株式会社アークシステム  本間 宏崇
         日本ヒューレット・パッカード株式会社   2006/7/6
前のページ  1  2   3  4  次のページ
AOPメソッド実行の処理

   ここでは非常にシンプルな処理を用います。シンプルだからこそAOPによるオーバーヘッドが明確にでると考えられます。

   またバイトコードをカスタマイズするライブラリとして、Seasar2はJavassistを、SpringはCGLIBを使用しています(SpringではCGLIBの代わりにDynamicProxyを使う選択肢がありますが、測定結果はCGLIBの方が若干速かったためCGLIBの結果を用いています)。
測定プログラム

   今回の測定に使用するプログラムを以下に示します。

コンポーネント
// もともとの処理
public class GreetingImpl implements Greeting {
   public String greet() {
      return null;
   }
}

// カスタマイズして加える処理
public class GreetInterceptor implements MethodInterceptor {
   public Object invoke(MethodInvocation invocation) throws Throwable {
      invocation.proceed(); // もともとの処理を実行する
      return "Hello";
   }
}
   「GreetingImpl#greet」がカスタマイズ対象になり、以下の設定ファイルによって「GreetInterceptor#invoke」が加えられます。

設定ファイル(Seasar2)
<components>
   <component name="greeting" class="xxx.GreetingImpl">
      <aspect>greetInterceptor</aspect>
   </component>
   <component name="greetInterceptor" class="xxx.GreetInterceptor" />
</components>
</code>

<緑>設定ファイル(Spring)</緑>
<code>
<beans>
   <bean id="greetingTarget" class="xxx.GreetingImpl" />
   <bean name="greetInterceptor" class="xxx.GreetInterceptor" />
   <bean
      name="greeting"
      class="org.springframework.aop.framework.ProxyFactoryBean"
   >
      <property name="proxyInterfaces"><value>xxx.Greeting</value></property>
      <property name="target"><ref bean="greetingTarget" /></property>
      <property name="interceptorNames"><value>greetInterceptor</value></property>
   </bean>
</beans>

   実際に測定するプログラムは以下のようになります。またSpringも同様なプログラムです。

プログラム(Seasar2)
Greeting greeting = (Greeting) container.getComponent("greeting");
long start = System.currentTimeMillis();
for (int i = 0; i < times_; i++) {
   greeting.greet();
}
long end = System.currentTimeMillis();
// end - startを記録

   コンテナから1度だけ取り出し、カスタマイズされた「GreetingImpl#greet」を複数回実行します。


結果

   結果のグラフを図2に示します。

AOPのメソッド実行時間
図2:AOPのメソッド実行時間

   図2をみるとわかるように3倍ほど差が付きましたが、実行回数が10,000,000回と多く、また実際の時間も小さいので、現実的には無視できる差といえるでしょう。


理由

   Seasar2はバージョン2.1まではCGLIBを使用していましたが、バージョン2.2からJavassistを使用しています。その際に処理速度が3倍速くなったという経緯がありました。

   これは単純にJavaassistが速いというわけではなく、Seasar2のバージョン2.2の時点で、Javaassistにチューニングを行ったことによるものです。CGLIBに比べるとJavassistはチューニングしやすく、それが今回の結果につながっていると考えられます。

前のページ  1  2   3  4  次のページ


株式会社電通国際情報サービス  比嘉 康雄
著者プロフィール
株式会社電通国際情報サービス  比嘉 康雄
1992年、電通国際情報サービス入社。1996年にOracleに触れたことでソフトウェアの魅力に開眼。その後、日本産オープンソース「Seasar」の開発を中心になって行い、2004年5月に「Seasar2」をリリース。
http://www.isid.co.jp/
http://d.hatena.ne.jp/higayasuo/

株式会社アークシステム  本間 宏崇
著者プロフィール
株式会社アークシステム  本間 宏崇
プログラマ。2004年より(株)アークシステムに所属。最近の興味はペアプログラミング・テスト駆動開発・プロジェクト自動化など。現在はWebアプリケーションフレームワーク「Teeda
http://teeda.seasar.org/ja/)」の開発に携わっている。

日本ヒューレット・パッカード株式会社
著者プロフィール
日本ヒューレット・パッカード株式会社
今回、Seasar2とSpringのパフォーマンスの検証を行う際の環境を提供しています。

INDEX
第4回:AOP機能のパフォーマンス比較
  はじめに
AOPメソッド実行の処理
  AOPのweaving処理
  AOP自動登録