TOPシステム開発> はじめに
パフォーマンス徹底比較!! Seasar2 VS Spring
パフォーマンス徹底比較!! Seasar2 VS Spring

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

   今回はDI処理のパフォーマンスを見ていきます。DIコンテナのまさにメインとなる機能です。DIは大変便利で魔法のように見えますが、その反面コンテナ内部の処理が見えづらいところでもあります。
DI

   まずDI時の処理を簡単に説明すると、図1のようになります。

DI時の処理
図1:DI時の処理

   2と3はDIの有無に関わらず行いますので、1と4がDIの処理になります。1については、以下の2つの場合で測定します。

  • DI情報を設定ファイルへ明示的に指定した場合
  • DI情報をコンポーネントのリフレクション情報から取得する場合

表1:測定のパターン


測定プログラム(明示的にDIする場合)

   まずは明示的に設定ファイルへ記述した場合から見ていきましょう。コンポーネントとSeasar2での設定ファイルを以下に示します。

設定ファイル(Seasar2)
<components>
   <component name="component00000A" class="xxx.Bean00000AImpl" autoBinding="none">
      <property name="bean00000B">component00000B</property>
   </component>
   <component name="component00000B" class="xxx.Bean00000BImpl" autoBinding="none"/>

   <component name="component00001A" class="xxx.Bean00001AImpl" autoBinding="none">
      <property name="bean00001B">component00001B</property>
   </component>
   <component name="component00001B" class="xxx.Bean00001BImpl" autoBinding="none"/>
   :

コンポーネント(00000〜00999の1,000セット)
public interface Bean00000A {
}

public interface Bean00000B {
}

public class Bean00000AImpl implements Bean00000A {
   private Bean00000B bean00000B;
   public void setBean00000B(Bean00000B bean00000B) {
      this.bean00000B = bean00000B;
   }
}

public class Bean00000BImpl implements Bean00000B {
}

   この設定ファイルのproperty要素で、コンポーネントAへコンポーネントBをセットすることを明示しています。コンポーネントAはコンポーネントBを引数に取るsetterメソッドを持っているため、DIコンテナはsetterメソッドでコンポーネントBをセットします。

   今回はコンポーネントAとBを1組として1,000組(2,000個)を記述しています。まずコンテナを生成し、コンポーネントAの数だけ(1,000回)コンポーネントAの方をコンテナから取り出しています。


結果(明示的にDIする場合)

   結果は図2、3のようになります。コンテナ生成は2倍近く(2秒ほど)Seasar2の方が速くなりました。コンポーネント取得は同程度です。

コンテナ生成(明示的にDIする場合)
図2:コンテナ生成(明示的にDIする場合)

コンポーネント取得(明示的にDIする場合)
図3:コンポーネント取得(明示的にDIする場合)


理由(明示的にDIする場合)

   DIを行わない場合(第2回の図1、2,000個の欄)と比べると、どちらのコンテナも遅くなっています。それは以下の理由からだと考えられます。

  • 設定ファイルの記述が増えた分、XML読み込みに時間がかかるようになった
  • DI処理の時間がかかるようになった

表2:処理が遅くなった理由

   ここでDI処理だけでどれくらい時間がかかるのか気になるところですが、この測定ではコンテナ生成に含まれてしまっているため判別できません。そこでprototypeに注目します。

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
第3回:DI処理のパフォーマンス比較
はじめに
  prototypeコンポーネント(明示的にDIする場合)
  測定プログラム(自動でDIする場合)
  prototypeコンポーネント(自動でDIする場合)