パフォーマンス徹底比較 seasar2 vs...
TRANSCRIPT
![Page 1: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/1.jpg)
© Copyright the Seasar Foundation and the others 2006. all rights reserved.1
パフォーマンス徹底比較Seasar2 vs Spring
2006/04/12株式会社電通国際情報サービス
ひがやすを株式会社アークシステム
本間 宏崇
![Page 2: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/2.jpg)
2© Copyright the Seasar Foundation and the others 2006. all rights reserved.
目的
• DIコンテナの実装によるパフォーマンスの
違いを明らかにする
• DIコンテナが行う処理の中で、どこに時間が
掛かるのかを明らかにする
![Page 3: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/3.jpg)
3© Copyright the Seasar Foundation and the others 2006. all rights reserved.
ベンチマーク測定環境
• ハードウェア– HP ProLiant DL360 G4p– CPU: Intel Xeon 3.80GHz (2 CPU)– Memory: 4GB
• ソフトウェア– OS: Red Hat Enterprise Linux AS 4 Update 3
(x86)– Java: 1.5.0_06 (Sun)
![Page 4: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/4.jpg)
4© Copyright the Seasar Foundation and the others 2006. all rights reserved.
測定アプリケーション
• DIコンテナ
– Seasar 2.4 beta1 (2006/03/27)– Spring 2.0 M3 (2006/03/08)
• ベンチマークプログラム
– 自作
![Page 5: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/5.jpg)
5© Copyright the Seasar Foundation and the others 2006. all rights reserved.
測定方法
• VMオプション
• -Xmx1024M• -Xms1024M• -XX:PermSize=384M• -XX:MaxPermSize=384M• fork=true
• JVMのキャッシュをクリアするため
• 5回実行し、最大・最小を除いた3回の平均値
を採る
![Page 6: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/6.jpg)
6© Copyright the Seasar Foundation and the others 2006. all rights reserved.
DIコンテナがやっていること
• コンテナ生成– XML読み込み(DOMやSAX)
• 定義からコンポーネントを組み立てる– DI
• リフレクション– リフレクション情報を取得しキャッシュする
– リフレクションを使用しプロパティへアクセスする
– AOP• バイトコード作成
![Page 7: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/7.jpg)
7© Copyright the Seasar Foundation and the others 2006. all rights reserved.
• それぞれの処理について、パフォーマンスを見ていきましょう
• まずは、XML読み込みを行っている、コンテナ
生成処理からです。
![Page 8: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/8.jpg)
8© Copyright the Seasar Foundation and the others 2006. all rights reserved.
コンテナ生成
• コンテナ生成時の内部処理– Seasar
• SAX• リフレクション情報をキャッシュ
– Spring• DOM• ※リフレクション処理はここでは行わない
![Page 9: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/9.jpg)
9© Copyright the Seasar Foundation and the others 2006. all rights reserved.
• コンテナへ入力する設定ファイル– Seasar
– Spring<beans>
<bean name="nullBean00000" class=“xxx.NullBean00000" /><bean name="nullBean00001" class=“xxx.NullBean00001" />
…
<components><component name="nullBean00000" class="xxx.NullBean00000" /><component name="nullBean00001" class="xxx.NullBean00001" />…
![Page 10: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/10.jpg)
10© Copyright the Seasar Foundation and the others 2006. all rights reserved.
コンテナ生成
0
500
1000
1500
2000
2500
3000
3500
4000
4500
5000
1000 2000 5000 10000
コンポーネント数
ミリ
秒
Seasar
Spring
• コンテナ生成処理
![Page 11: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/11.jpg)
11© Copyright the Seasar Foundation and the others 2006. all rights reserved.
コンテナ生成:結果
• Seasar ≒ Spring
• 理由– リフレクション情報をキャッシュするぶんSeasarの
方が多くの処理を行っていますが、SAXとDOMの
性能差によって吸収されていると思われます。
![Page 12: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/12.jpg)
12© Copyright the Seasar Foundation and the others 2006. all rights reserved.
コンポーネント取得
• 次は、生成したコンテナからコンポーネントを取得する処理です
• コンテナに登録されている全てのコンポーネントを取得するのに掛かった時間を計測しました– DI・AOPは使用していません
– 単純に、コンテナからコンポーネントを取得するのみです
![Page 13: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/13.jpg)
13© Copyright the Seasar Foundation and the others 2006. all rights reserved.
コンポーネント取得
0
2000
4000
6000
8000
10000
12000
1000 2000 5000 10000
コンポーネント数
ミリ
秒
Seasar
Spring
![Page 14: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/14.jpg)
14© Copyright the Seasar Foundation and the others 2006. all rights reserved.
コンポーネント取得:結果
• Seasar >>(10~30倍)>> Spring– 1000個で1400ms
• コンポーネントを生成するという点ではどちらも一緒のはずですが、どうして差が出るのでしょうか?
![Page 15: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/15.jpg)
15© Copyright the Seasar Foundation and the others 2006. all rights reserved.
コンポーネント取得
• 理由– DIコンテナは、コンポーネントを生成するためにリ
フレクション情報を使用しています
– Seasarはコンテナ生成時にリフレクション情報を
キャッシュしています。コンポーネント生成時にはキャッシュした情報を使用しています
– Springはコンポーネントを取得するときにリフレク
ション情報をキャッシュしています
![Page 16: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/16.jpg)
16© Copyright the Seasar Foundation and the others 2006. all rights reserved.
コンポーネント取得
• 理由– Springはコンポーネント取得時にリフレクション処
理を行っているため、遅くなります
– Seasarはコンテナ生成時にリフレクション処理を行っていますが、SAXとDOMの性能差によってSpringとの差が無くなっています
– そのため、コンポーネント取得時にSeasarの速さ
が際立っています
![Page 17: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/17.jpg)
17© Copyright the Seasar Foundation and the others 2006. all rights reserved.
リフレクション処理
• では、SeasarとSpringのリフレクション処理はどれくらい違うのでしょうか?– リフレクション処理を行うクラスを直接呼び出して
測定しました。• Seasar: BeanDescImpl• Spring: BeanWrapperImpl
![Page 18: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/18.jpg)
18© Copyright the Seasar Foundation and the others 2006. all rights reserved.
リフレクション処理
0
2000
4000
6000
8000
10000
12000
14000
1000 2000 5000 10000
コンポーネント数
ミリ
秒
Seasar
Spring
• リフレクション情報をキャッシュ
![Page 19: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/19.jpg)
19© Copyright the Seasar Foundation and the others 2006. all rights reserved.
リフレクション処理:結果
• Seasar >(3倍)> Spring– 1000回で1300ms
• 理由– Seasarはリフレクションキャッシュ処理を独自で実
装しています。SpringのBeanWrapperImplはJDKのIntrospectorを使用しています。この違いが速度差となっていると思われます
– キャッシュ実装の違い• Seasar: HashMap• Spring: WeakHashMap
![Page 20: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/20.jpg)
20© Copyright the Seasar Foundation and the others 2006. all rights reserved.
Seasarのコンテナinit処理
• Seasarではコンテナ生成直後にinit処理を行うこと
ができます– 先ほどまではコンテナのinit処理を行っていませんでした
– init処理を行わない場合は、1度目にコンポーネントを取
得したタイミングで、そのコンポーネントがインスタンス化されます
• init処理ではsingletonのコンポーネントを作成する
ことができます– singletonとは、コンポーネント生成は最初1度だけで、そ
の後は最初に生成したコンポーネントを返すこと
![Page 21: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/21.jpg)
21© Copyright the Seasar Foundation and the others 2006. all rights reserved.
Seasarのコンテナinit処理
• 実際の案件では、アプリケーション起動時にinit処理でsingletonのコンポーネントを生成
した方が効率的です– Springにはこのような機能はありません
• init処理を含めた場合のコンテナ生成でのパ
フォーマンスを見てみましょう– Seasar: コンテナ生成 + init– Spring: コンテナ生成
![Page 22: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/22.jpg)
22© Copyright the Seasar Foundation and the others 2006. all rights reserved.
Seasarのコンテナinit処理
0
1000
2000
3000
4000
5000
6000
1000 2000 5000 10000
コンポーネント数
ミリ
秒
Seasar
Spring
• コンテナ生成( + init処理)
![Page 23: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/23.jpg)
23© Copyright the Seasar Foundation and the others 2006. all rights reserved.
Seasarのコンテナinit処理:結果
• Seasar ≒ Spring
• 理由– init処理ではsingletonのオブジェクトを生成して
いるだけなので、それほど時間が掛かりません
– コンテナ作成時の速度はSeasarの方が速いため、initでのオーバーヘッドをカバーできます
![Page 24: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/24.jpg)
24© Copyright the Seasar Foundation and the others 2006. all rights reserved.
• では...• create + initした場合での、コンポーネント取
得パフォーマンスは?
![Page 25: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/25.jpg)
25© Copyright the Seasar Foundation and the others 2006. all rights reserved.
• create + initした後のコンポーネント取得処理
0
2000
4000
6000
8000
10000
12000
14000
1000 2000 5000 10000
コンポーネント数
ミリ
秒
Seasar
Spring
![Page 26: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/26.jpg)
26© Copyright the Seasar Foundation and the others 2006. all rights reserved.
結果
• Seasar >>>>>>> (60~200倍) >>>>>>>>>>>>> Spring– 1000個で1500ms
• 実際の案件ではアプリケーション初期化時にcreate + init処理を行っているので、これが現実のプロジェクトで起こる結果を反映しています– ただし、コンテナから2回目に取り出すときは、
SeasarもSpringもキャッシュしたオブジェクトを返すだけなので、差は付きません
![Page 27: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/27.jpg)
27© Copyright the Seasar Foundation and the others 2006. all rights reserved.
prototype
• 今まではsingletonの場合でした。今度はprototypeの場合を見てみましょう
– prototypeとは、コンポーネントを取得するたびに
新たに生成することです
• prototypeでも1度目の取得はsingletonと同
様に圧倒的な差が出ます
• 2度目の取得で比べてみましょう
![Page 28: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/28.jpg)
28© Copyright the Seasar Foundation and the others 2006. all rights reserved.
prototype
• prototypeで2度目のコンポーネント取得
0
100
200
300
400
500
600
700
800
900
1000 2000 5000 10000
コンポーネント数
ミリ
秒
Seasar
Spring
![Page 29: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/29.jpg)
29© Copyright the Seasar Foundation and the others 2006. all rights reserved.
prototype:結果
• Seasar >(3~5倍)> Spring– 1000個で130ms
• 理由– Springでは対象となるオブジェクトに加えて
BeanWrapperImplを毎回作っていますが、Seasarでは対象となるオブジェクトしか作りません。これが原因の1つかもしれません。
![Page 30: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/30.jpg)
30© Copyright the Seasar Foundation and the others 2006. all rights reserved.
DI (Manual)
• 次はDI処理について見てみましょう
– DIとは、あるコンポーネントが必要とする他のコンポーネントを、コンテナがセットしてあげることです(ざっくり)
• 現実的な状況を反映させるため、最初にコンテナ生成とinitを実行した上で比較しています
– コンテナへコンポーネントを2000個登録しています。2個で1組です。
![Page 31: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/31.jpg)
31© Copyright the Seasar Foundation and the others 2006. all rights reserved.
DI (Manual)
0
500
1000
1500
2000
2500
3000
3500
ミリ
秒
Seasar
Spring
• コンテナ生成 (Seasarはinitを含む)
![Page 32: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/32.jpg)
32© Copyright the Seasar Foundation and the others 2006. all rights reserved.
DI (Manual):結果
• Seasar < Spring– 差は600ms
• 前回コンテナ生成を比較した場合はほぼ一緒でしたが...
![Page 33: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/33.jpg)
33© Copyright the Seasar Foundation and the others 2006. all rights reserved.
DI (Manual):結果
• 理由– 今回2000個のコンポーネントでコンテナ生成した
場合は600ms差が出ています
– この差はリフレクションキャッシュによるものです
– 前回より1000個余分にキャッシュしていることが今回の600msの差につながっています• Seasarでリフレクションキャッシュ1000個と2000個を作
成する時間の差が400msでしたので、若干違いますがほぼその差と思われます
• 差が大きくないのと、初期化時の処理であることを考えると、現実にはあまり問題にならないと思います
![Page 34: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/34.jpg)
34© Copyright the Seasar Foundation and the others 2006. all rights reserved.
DI (Manual)
• 今度は実際にユーザに影響する部分である、DIしたコンポーネントを取得する処理を見て
みましょう
![Page 35: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/35.jpg)
35© Copyright the Seasar Foundation and the others 2006. all rights reserved.
DI (Manual)
0
500
1000
1500
2000
2500
3000
ミリ
秒
Seasar
Spring
• DIしたコンポーネントを取得(1000個)– Manual DI– singleton
![Page 36: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/36.jpg)
36© Copyright the Seasar Foundation and the others 2006. all rights reserved.
DI (Manual):結果
• Seasar >>>>>> (100倍) >>>>>>>>>>>>>> Spring– 1000セットで2400ms
• DI無しの場合と比べると...– 今回は2000個から1000個取り出していますが、
1000個から1000個取り出すのと速度は同じです
ので、そのときと比べてみましょう
• DI無しの場合は60倍、今回は100倍。DIする
ことによってさらに差が開いています。
![Page 37: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/37.jpg)
37© Copyright the Seasar Foundation and the others 2006. all rights reserved.
DI (Manual):結果
• 理由– DIするときに、プロパティに対してリフレクションで
アクセスしています
– リフレクションを行うクラスの性能差が一因と思われます
• リフレクションでのアクセスがどれくらいか見てみましょう– 1プロパティへset, getして測定しました
• Seasar: BeanDescImpl• Spring: BeanWrapperImpl
![Page 38: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/38.jpg)
38© Copyright the Seasar Foundation and the others 2006. all rights reserved.
リフレクション
0
100
200
300
400
500
600
1000 2000 5000 10000
回数(set, getで1回)
ミリ
秒
Seasar
Spring
• リフレクションでのプロパティアクセス
![Page 39: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/39.jpg)
39© Copyright the Seasar Foundation and the others 2006. all rights reserved.
リフレクション:結果
• Seasar > (4~8倍) > Spring– 1000回で100ms
• 理由– BeanDescImplとBeanWrapperImplの差と思わ
れます• BeanWrapperImplではネストしたプロパティをサポー
トしており、それ関連のオーバーヘッド(文字列操作とか)が大きいと思われます
![Page 40: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/40.jpg)
40© Copyright the Seasar Foundation and the others 2006. all rights reserved.
• 次は、prototypeで明示的にDIを指定した場合の、2度目のアクセスについてです
![Page 41: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/41.jpg)
41© Copyright the Seasar Foundation and the others 2006. all rights reserved.
0
50
100
150
200
250
ミリ
秒
Seasar
Spring
• DIしたコンポーネントを取得(1000個)– Manual DI– prototype
![Page 42: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/42.jpg)
42© Copyright the Seasar Foundation and the others 2006. all rights reserved.
結果
• Seasar >(3倍)> Spring– 1000セットで150ms
• DIしない場合でもprototypeでの2度目の取得は3~5倍の差だったので、DI処理のぶん
更に差が出ると思いましたが、想定したほどではありませんでした
![Page 43: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/43.jpg)
43© Copyright the Seasar Foundation and the others 2006. all rights reserved.
autowire
• 設定ファイルを少しでも少なくするために、autowireというものがあります
– 設定ファイルにDIを指定するpropertyタグを書か
なくて良くなります
– autowireには幾つか種類がありますが、ここでは型によるDIを使用しています
![Page 44: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/44.jpg)
44© Copyright the Seasar Foundation and the others 2006. all rights reserved.
autowire
0
1000
2000
3000
4000
5000
6000
7000
ミリ
秒Seasar
Spring
• DIしたコンポーネントを取得(1000個)– autowire byType– singleton
![Page 45: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/45.jpg)
45© Copyright the Seasar Foundation and the others 2006. all rights reserved.
autowire:結果
• Seasar >>>>>>>>>>>>>>>>>>>>>>>>>(300倍)>>>>>>>>>>> Spring– 1000セットで6000ms
• Manualでは100倍の差でしたが、Autoにすると更に3倍の差が付きました
![Page 46: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/46.jpg)
46© Copyright the Seasar Foundation and the others 2006. all rights reserved.
autowire:結果
• 理由– autowire時にはDI対象を探すロジックが実行さ
れます• SpringではDIの度に、毎回コンテナへ登録されている
全てのオブジェクトへアクセスします– コンテナには2000個登録されていて、1000回DIしているので、
2000 * 1000回コンポーネント定義へアクセスしています。
• Seasarはコンポーネントを登録するときにクラスの型をキー情報としてハッシュテーブルへ登録しているので、DIの度に1回のアクセスで済みます
– つまりDIの度にListへ全件アクセスするのかHashMapへキーでアクセスするのかの差なので、差が付いて当たり前と言えるでしょう
![Page 47: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/47.jpg)
47© Copyright the Seasar Foundation and the others 2006. all rights reserved.
• autowireでprototypeの場合はどうでしょうか?– 2回目のコンポーネント取得時
![Page 48: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/48.jpg)
48© Copyright the Seasar Foundation and the others 2006. all rights reserved.
0
500
1000
1500
2000
2500
3000
ミリ
秒
Seasar
Spring
• DIしたコンポーネントを取得(1000個)– autowire byType– prototype
![Page 49: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/49.jpg)
49© Copyright the Seasar Foundation and the others 2006. all rights reserved.
結果
• Seasar >>>> (35倍) >>>>> Spring– 1000セットで2300ms
• 理由– singletonと同じで、DI対象を探すロジックの差で
しょう
• singletonほどではありませんが、大きな差が
出ました
![Page 50: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/50.jpg)
50© Copyright the Seasar Foundation and the others 2006. all rights reserved.
AOP
• AOPとは、バイトコードを操作し もともとの処理をカスタマイズするもの (ざっくり)
• AOPを掛けたメソッドを実行して、速度差を見
てみましょう– 今回のAOPは文字列を返すだけの、非常にシン
プルなものです。だからこそAOPのオーバーヘッ
ドがわかりやすいと思います
– 10,000,000回メソッドを実行
• SeasarはJavassist• SpringはCGLIB (DynamicProxyよりも速い)
![Page 51: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/51.jpg)
51© Copyright the Seasar Foundation and the others 2006. all rights reserved.
AOP
0
500
1000
1500
2000
2500
3000
3500
ミリ
秒
Seasar
Spring
• AOPを仕掛けたメソッドを実行
![Page 52: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/52.jpg)
52© Copyright the Seasar Foundation and the others 2006. all rights reserved.
AOP:結果
• Seasar >(3~4倍)> Spring– 10,000,000回で2400ms
• 理由– Seasarは2.1まではCGLIBで2.2からはJavassist
に変えて、約3倍速くなったことがあります
– CGLIBを使うと殆どチューニングの余地がありませんが、Javassistにはチューニングの余地があります
– Seasarではかなりのチューニングを行っているので、速くなっていると思われます
![Page 53: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/53.jpg)
53© Copyright the Seasar Foundation and the others 2006. all rights reserved.
AOP weaving
• AOPを組み込むバイトコード操作を、weavingと呼んでいます
• このweavingもパフォーマンスに与える影響
があると考えたため、測定してみました
![Page 54: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/54.jpg)
54© Copyright the Seasar Foundation and the others 2006. all rights reserved.
AOP weaving
• まずは、weavingするクラスを直接呼び出し
て、速度差を比較しました– Seasar: AopProxy– Spring: ProxyFactory
![Page 55: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/55.jpg)
55© Copyright the Seasar Foundation and the others 2006. all rights reserved.
AOP weaving
• AOPのWeaving
0
20000
40000
60000
80000
100000
120000
140000
1000 2000 5000 10000
回数
ミリ
秒
Seasar
Spring
![Page 56: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/56.jpg)
56© Copyright the Seasar Foundation and the others 2006. all rights reserved.
AOP weaving:結果
• Seasar >(3倍)> Spring– 1000回で8000ms
• 理由– JavassistとCGLIBでのバイトコードweavingの速
度差と思われます
• AOPのweavingにかかる絶対時間が大きいことがわかります (1000個で8秒!)
![Page 57: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/57.jpg)
57© Copyright the Seasar Foundation and the others 2006. all rights reserved.
• 次は、登録されているコンポーネントへまとめてAspectを仕掛けて、コンテナを生成してみ
ます
• まとめてAspectを仕掛ける機能
– Seasar: AspectAutoRegister– Spring: AutoProxyCreator
• これらを使ってみました
![Page 58: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/58.jpg)
58© Copyright the Seasar Foundation and the others 2006. all rights reserved.
0
50000
100000
150000
200000
250000
300000
1000 2000 5000 10000
回数
ミリ
秒
Seasar
Spring
• AOP自動登録でのコンテナ生成
![Page 59: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/59.jpg)
59© Copyright the Seasar Foundation and the others 2006. all rights reserved.
結果
• Seasar >>> (15~60倍) > > > Spring– 1000個で15000ms
• 理由
– リフレクション情報のキャッシュ
– AOP weaving• やはり、AOP weavingはDIコンテナの処理の
中では重い部類に入ることがわかります
![Page 60: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/60.jpg)
60© Copyright the Seasar Foundation and the others 2006. all rights reserved.
• 補足情報– Springは(今回使用した方法で)AOPを登録する
と、コンテナ生成時にリフレクション情報をキャッシュしコンポーネントを生成するようです• 1度目のコンポーネント取得時に発生していた負荷が
コンテナ生成時に寄っています
• そのぶん、コンポーネント取得時の速度はSeasarと同
じくらいに速くなっています
![Page 61: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/61.jpg)
61© Copyright the Seasar Foundation and the others 2006. all rights reserved.
まとめ
• DIという同じ技術を実装してこれほどの差が
出るのはかなり驚きです
• ある程度、原因も指摘しているので、この結果を元にSpringのチューニングに役立てても
らえれば幸いです
• この結果およびテストプログラムはオープンソースとして公開する予定です
![Page 62: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます](https://reader033.vdocuments.net/reader033/viewer/2022042114/5e9078fa67915617210f66f1/html5/thumbnails/62.jpg)
62© Copyright the Seasar Foundation and the others 2006. all rights reserved.
本日はご静聴いただきありがとうございました。