62
© Copyright the Seasar Foundation and the others 2006. all rights reserved. 1 パフォーマンス徹底比較 Seasar2 vs Spring 2006/04/12 株式会社電通国際情報サービス ひがやすを 株式会社アークシステム 本間 宏崇

パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: パフォーマンス徹底比較 Seasar2 vs Springs2container.seasar.org/ja/benchmark/20060412_seasar_vs...パフォーマンス徹底比較 Seasar2 vs Spring ... れます

© 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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

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 ... れます

62© Copyright the Seasar Foundation and the others 2006. all rights reserved.

本日はご静聴いただきありがとうございました。