|
||||||||||
| 前のページ 1 2 3 | ||||||||||
| prototype | ||||||||||
|
DIコンテナには、先ほどのsingletonの他にもprototypeというインスタンスモードがあります。singletonとの違いは、コンテナから取得するたびに異なるインスタンスが返される点です。つまりコンポーネント取得時に毎回インスタンスを生成しているということです。 |
||||||||||
| 測定プログラム | ||||||||||
|
Seasar2でのプログラムを掲載します。Springでも同様です。 設定ファイル(Seasar2)
<components>
プログラム(Seasar2)
DecimalFormat format = new DecimalFormat("00000");
|
||||||||||
| 結果 | ||||||||||
|
なかなか興味深い結果となりました。コンテナ生成(図3)はほぼ同じ速度ですが、1度目のコンポーネント取得(図4)では20〜30倍の差がついています(1,000個のコンポーネントで1.5秒)。また2回目のコンポーネント取得(図5)は3〜5倍Seasar2の方が速い結果となりました(1,000個のコンポーネントで130ミリ秒)。しかしそれほど大きい数値ではありません。 ![]() 図3:prototype、コンテナ生成 ![]() 図4:prototype、コンポーネント取得(1度目) ![]() 図5:prototype、コンポーネント取得(2度目)
※注2:
この測定では1,000個より2,000個の方が速いという不可解な結果がでてしまいました。1度目の取得では1,000個より2,000個の方が、時間がかかるという順当な結果なのですが(グラフは省いています)、2度目の取得はご覧の通りです。理由をお伝えできないことをお詫びいたします。 |
||||||||||
| 理由 | ||||||||||
|
まずコンテナ生成と1度目のコンポーネント取得について考えてみましょう。Springの結果は、第1回の図1、2と似ていることがわかります。ApplicationContextを使うことで、singletonコンポーネントの取得は速くなりましたが、prototypeコンポーネントの取得には影響がなさそうです。 この原因は次のように考えられます。
表3:prototypeコンポーネントによる差の原因 Springのリフレクション情報取得処理は遅いため(「第1回:どっちが速いSeasar2 VS Spring」の図3を参照)、prototypeコンポーネントでもコンテナ生成時に行って欲しいと思うのは筆者だけでしょうか。 次に2度目のコンポーネント取得の差についてですが、Springでは対象となるコンポーネントに加えてBeanWrapperImplクラスを毎回生成していることが、原因の1つと考えられます。 |
||||||||||
| おわりに | ||||||||||
|
次回はDIコンテナのまさにメインとなる機能であるDI処理のパフォーマンスを見ていきます。 また、ベンチマークプログラムを下記のSubversionリポジトリで公開しています。興味のある方はSubversionクライアントからチェックアウトしていただけましたらと思います。 |
||||||||||
|
前のページ 1 2 3 |
||||||||||
|
|
||||||||||
|
|
||||||||||
|
||||||||||
|
|
||||||||||
|
||||||||||
|
|
||||||||||
|
||||||||||
|
|
||||||||||
|
||||||||||
|
|
||||||||||
|
||||||||||




