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

Similar documents
Seasar.NET入門

(Microsoft PowerPoint - Java\221\3461\225\224\211\357\224\255\225\\\227p\216\221\227\ ppt)

PowerPoint プレゼンテーション

V8.1新規機能紹介記事

Microsoft Word - nvsi_050110jp_netvault_vtl_on_dothill_sannetII.doc

(Microsoft PowerPoint - Java\221\3462\225\224\211\357\224\255\225\\\216\221\227\ ppt)

プレポスト【問題】

デザインパターン第一章「生成《

富士通製プラットフォーム 「PRIMEPOWER/PRIMERGY」及び、富士通製ミドルウェア 「Interstage」とVantage Analyzer 動作検証完了報告書

検証事例 富士通株式会社

JBoss と Arquillian で実現する 究極のテスト環境 レッドハット株式会社 JBoss サービス事業部 コンサルタント 山 田義和

PowerPoint プレゼンテーション

Delphi/400でFlash動画の実装

平成20年度成果報告書

HashMapからConcurrentHashMapへの移行

memcached 方式 (No Replication) 認証情報は ログインした tomcat と設定された各 memcached サーバーに認証情報を分割し振り分けて保管する memcached の方系がダウンした場合は ログインしたことのあるサーバーへのアクセスでは tomcat に認証情報

Microsoft PowerPoint - G-1_Flexでつくる初めてのRIA.ppt

Red Hat Enterprise Linuxのcron(8)デーモンにデフォルト定義されたtmpwatch命令の動作による、WebOTXのトラブル対処方法

OpenAM 9.5 インストールガイド オープンソース ソリューション テクノロジ ( 株 ) 更新日 : 2013 年 7 月 19 日 リビジョン : 1.8

コードテンプレートフレームワーク 機能ガイド 基礎編

Indyを利用したメール送信機能開発

Microsoft Word - Hyper-V検証レポート docx

プログラミング入門1

第1章 ビジュアルプログラミング入門

組込み Linux の起動高速化 株式会社富士通コンピュータテクノロジーズ 亀山英司 1218ka01 Copyright 2013 FUJITSU COMPUTER TECHNOLOGIES LIMITED

PowerPoint プレゼンテーション

検証事例 富士通株式会社

今さら人には聞けないAOP入門

1. 検証概要 目的及びテスト方法 1.1 検証概要 Micro Focus Server Express 5.1 J の Enterprise Server が提供する J2EE Connector 機能は JCA 仕様準拠のコンテナとして多くの J2EE 準拠アプリケーションサーバーについて動作

ブート ~OS が起動されるまで~

RTC_STM32F4 の説明 2013/10/20 STM32F4 内蔵 RTC の日付 時刻の設定および読み込みを行うプログラムです UART2( 非同期シリアル通信ポート 2) を使用して RTC の設定および読み込みを行います 無料の開発ツール Atollic TrueSTUDIO for

DIコンテナ 前 回 ご 説 明 したSpring DIコンテナに 共 通 するこ とは 依 存 を 注 入 することによってシステム 内 に 存 在 するオブジェクト 同 士 の 結 びつきを 緩 くすることで あり そのための 仕 組 み 提 供 を 意 味 する [Spring のDIコンテナ

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

全部まとめてHOT deploy

1

11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS デザインパターンとは? デザインパターン 過去のソフトウェア設計者が生み出したオブジェクト指向設計に関して, ノウハウを蓄積し 名前をつけ 再利用しやすいようにカタログ化したもの 各デ

PowerPoint プレゼンテーション

Microsoft PowerPoint - FormsUpgrade_Tune.ppt

Webサービスを利用して機能UP!

内容 1 はじめに インストールの手順 起動の手順 Enterprise Architect のプロジェクトファイルを開く 内容を参照する プロジェクトブラウザを利用する ダイアグラムを開く 便利な機能.

Microsoft Word - catalog_tpass43.doc

JDK のインストール (2012 年 8 月時点でのバージョン ) Java の実行環境 開発環境は さまざまな企業 団体が開発 配布を行っているが 当テキストでは Java の生みの親である Sun MicroSystems 社 ( 現 Oracle 社 ) の実行環境 開発環境を使用する Ja

Microsoft Word - JP-AppLabs-MySQL_Update.doc

ガイダンス

概要 ABAP 開発者が SAP システム内の SAP ソースまたは SAP ディクショナリーオブジェクトを変更しようとすると 2 つのアクセスキーを入力するよう求められます 1 特定のユーザーを開発者として登録する開発者キー このキーは一度だけ入力します 2 SAP ソースまたは SAP ディクシ

XNA Framework

計算機アーキテクチャ

PRIMERGY RX300 S2 システム構成図

注意事項 (1)Windows 10 を使用する場合 注意事項 1 注意事項 3 注意事項 4 についてご対応をお願いします (2)Windows 8.1 を使用する場合 注意事項 2 注意事項 3 注意事項 4 についてご対応をお願いします (3)Windows 7 上で Internet Exp

独立行政法人 鉄道建設 運輸施設整備支援機構 電子入札システム 初期設定マニュアル 2019 年 4 月

更新履歴 No 更新箇所版数日付 1 第一版作成 /12/28 2 一部画像差し替え 誤字修正 /02/09 2

Microsoft PowerPoint - DNS_BoF_SCS_ pptx

ガイダンス

WebOTXプロファイラを使用したメモリリーク調査方法

ToDo: 今回のタイトル

C) 信頼済みサイトダイアログにて以下の操作を実施する 次の Web サイトをゾーンに追加する (D); 欄に電子入札 URL を入力する 追加 ボタンをクリックし Web サイト (W) に URL が追加されたことを確認する 3 上記 ~ を必要なサイト分行う 登録するWebサイト受注者 : h

VXPRO R1400® ご提案資料

(速報) Xeon E 系モデル 新プロセッサ性能について

人工知能入門

Microsoft PowerPoint - prog03.ppt

1. 機器の接続方法 ナンバーディスプレイアダプタ USBCID4-JP をご購入いただき 下図のように配線を接続していただきます パソコンがインターネットに接続されている場合は USB のプラグをパソコンに最初に接続した際に自動でアダプタのドライバがインストールされます ドライバのインストールには

26 editor.putint(pref_count_key, executecount); 27 // 変更した Preference を確定させる 28 editor.commit(); 29 } (c) 実行の様子実装して実行した様子を図 1 と図 2 に示す. 一度実行するごとに, カウン

2 概要 市場で不具合が発生にした時 修正箇所は正常に動作するようにしたけど将来のことを考えるとメンテナンス性を向上させたいと考えた リファクタリングを実施して改善しようと考えた レガシーコードなのでどこから手をつけて良いものかわからない メトリクスを使ってリファクタリング対象を自動抽出する仕組みを

Java の ConcurrentHashMap における同期化 バッドケースとその対処法 2013 年 9 月湊隆行 1. はじめに表 1.1 に示すように Java の Collections Framework には 3 つの世代があります バージョン 1.0 から存在するレガシー API バ

(ch2 + i)->next = ch1 + r; doit(ch1, ch2); 図 1 ランダムアクセスする C ソース 時間 (elapsed) 32 ビットプログラム (gcc -O2 -m32 でコンパイル ) 6.23 秒 秒 64 ビットプログラム (gcc -O2 -m

PowerPoint Presentation

平成20年度成果報告書

<4D F736F F D CC82BD82DF82CC50438AC28BAB90DD92E82E646F63>

開発・運用時のガイド JDK8への移行に伴う留意点 [UNIX]

使用する前に

Microsoft PowerPoint ppt

スライド 1

やってみようINFINITY-製品仕様書 品質評価表 メタデータ 編-

Microsoft PowerPoint ï½žéł»å�’å–¥æœ�ㇷㇹㅃㅀ㇤ㅳㇹㅋㅼㅫ曉逃.ppt [äº™æ‘łã…¢ã…¼ã…›]

PowerPoint プレゼンテーション

InfiniDB最小推奨仕様ガイド

1 開発ツールのインストール 最初に JDK をインストールし 次に IDE をインストールする という手順になります 1. JDK のインストール JDK のダウンロードとインストール JDK は次の URL でオラクル社のウェブページからダウンロードします

編集する ファイルを開く マイクロデータの設定を行うファイルまたはファイルを開きます 開かれたファイルは編集画面に表示されて ブラウザ表示した時のプレビューも同時に表示されます HTML ファイルの選択 編集する ファイルを開くためにメインメニューから ファイル 開く を選びます ファイル選択ダイア

459

ゆみる は こうげきりょく が 2 あがった!

2018/09/10 Windows10 について ( その四 ) Windows10 の Anniversary Update で ご一緒に検証をしてみましょう はじめに 日経 BP 社によりますと 日本では 67% が Win10 を使っているとのこと 実に全体の 3 分の 2 が Win10

アドバンストサーバ「HA8000シリーズ」において最新テクノロジーを採用しシステム性能を強化

Microsoft Word - A04 - Configuring Launch In Context_jp-ReviewedandCorrected a.doc

NEC Express5800 シリーズ COBOL Enterprise Edition クライアントライセンス V1 COBOL Enterprise Edition クライアントライセンス V1 (1 年間保守付き ) COBOL Enterprise Edition クライアントライセンス

VBコンバータ利用方法

テンプレートエンジンの必要性 昔 (2000 年ごろ?) の典型的な PHP のコード : <?php // 処理?> <html> <body> <?php print("hello World!");?> </body> </html> 以下のような問題で衝突していた 1 一旦プログラムコードを

Maser - User Operation Manual

intra-mart im-JavaEE Framework

Spring Framework 2.0  デファクトスタンダードDIコンテナの現在と未来

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

性能を強化した 第 12 世代 Dell PowerEdge サーバの RAID コントローラ Dell PERC H800 と PERC H810 の OLTP ワークロード性能比較 ソリューション性能分析グループ Luis Acosta アドバンストストレージエンジニアリング Joe Noyol

ソフトウェア & ハードウェア最適必要条件 PU: - Intel Core i7 3.2 GHz プロセッサ メモリ : - 6GB DDR3 (3x2GB) 1066 MHz メモリモジュール ストレージ : - 4 Four Solid State または 10,000 RPM SATA ディ

5-1- 応開発フレームワークに関する知識 開発フレームワークを利用した Web アプリケーションの実装方法を理 Ⅰ. 概要解する MVC や OR マッピング DIxAOP といった技術を理解する Ⅱ. 対象専門分野職種共通 Ⅲ. 受講対象者 本カリキュラムの 5-1- 基開発フレームワークに関す

NEC COBOL Enterprise Edition Developer クライアントライセンス V2.0 COBOL Enterprise Edition Developer クライアントライセンス V2.0 (1 年間保守付 ) COBOL Enterprise Edition Develo

Microsoft Word - nvsi_050090jp_oracle10g_vlm.doc

まず,13 行目の HardwareTimer Timer(1); は,HardwareTimer というクラスを利用するという宣言である. この宣言によって Timer というインスタンスが生成される.Timer(1) の 1 は,OpenCM に 4 個用意されているタイマのうち,1 番のタイマ

インテル(R) Visual Fortran コンパイラ 10.0

Transcription:

パフォーマンス徹底比較 Seasar2 vs Spring 2006/04/12 株式会社電通国際情報サービスひがやすを株式会社アークシステム本間宏崇 1

目的 DI コンテナの実装によるパフォーマンスの違いを明らかにする DI コンテナが行う処理の中で どこに時間が掛かるのかを明らかにする 2

ベンチマーク測定環境 ハードウェア 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) 3

DI コンテナ Seasar 2.4 beta1 (2006/03/27) Spring 2.0 M3 (2006/03/08) ベンチマークプログラム 自作 測定アプリケーション 4

VM オプション -Xmx1024M -Xms1024M -XX:PermSize=384M -XX:MaxPermSize=384M fork=true JVM のキャッシュをクリアするため 測定方法 5 回実行し 最大 最小を除いた 3 回の平均値を採る 5

DI コンテナがやっていること コンテナ生成 XML 読み込み (DOM や SAX) 定義からコンポーネントを組み立てる DI リフレクション リフレクション情報を取得しキャッシュする リフレクションを使用しプロパティへアクセスする AOP バイトコード作成 6

それぞれの処理について パフォーマンスを見ていきましょう まずは XML 読み込みを行っている コンテナ生成処理からです 7

コンテナ生成 コンテナ生成時の内部処理 Seasar SAX リフレクション情報をキャッシュ Spring DOM リフレクション処理はここでは行わない 8

コンテナへ入力する設定ファイル Seasar <components> <component name="nullbean00000" class="xxx.nullbean00000" /> <component name="nullbean00001" class="xxx.nullbean00001" /> Spring <beans> <bean name="nullbean00000" class= xxx.nullbean00000" /> <bean name="nullbean00001" class= xxx.nullbean00001" /> 9

コンテナ生成 コンテナ生成処理 5000 4500 4000 3500 3000 ミリ秒 2500 2000 1500 Seasar Spring 1000 500 0 1000 2000 5000 10000 コンポーネント数 10

コンテナ生成 : 結果 Seasar Spring 理由 リフレクション情報をキャッシュするぶん Seasar の方が多くの処理を行っていますが SAX と DOM の性能差によって吸収されていると思われます 11

コンポーネント取得 次は 生成したコンテナからコンポーネントを取得する処理です コンテナに登録されている全てのコンポーネントを取得するのに掛かった時間を計測しました DI AOP は使用していません 単純に コンテナからコンポーネントを取得するのみです 12

コンポーネント取得 12000 10000 8000 ミリ秒 6000 4000 Seasar Spring 2000 0 1000 2000 5000 10000 コンポーネント数 13

コンポーネント取得 : 結果 Seasar >>(10~30 倍 )>> Spring 1000 個で 1400ms コンポーネントを生成するという点ではどちらも一緒のはずですが どうして差が出るのでしょうか? 14

コンポーネント取得 理由 DI コンテナは コンポーネントを生成するためにリフレクション情報を使用しています Seasar はコンテナ生成時にリフレクション情報をキャッシュしています コンポーネント生成時にはキャッシュした情報を使用しています Spring はコンポーネントを取得するときにリフレクション情報をキャッシュしています 15

コンポーネント取得 理由 Spring はコンポーネント取得時にリフレクション処理を行っているため 遅くなります Seasar はコンテナ生成時にリフレクション処理を行っていますが SAX と DOM の性能差によって Spring との差が無くなっています そのため コンポーネント取得時に Seasar の速さが際立っています 16

リフレクション処理 では Seasar と Spring のリフレクション処理はどれくらい違うのでしょうか? リフレクション処理を行うクラスを直接呼び出して測定しました Seasar: BeanDescImpl Spring: BeanWrapperImpl 17

リフレクション処理 リフレクション情報をキャッシュ 14000 12000 10000 ミリ秒 8000 6000 4000 Seasar Spring 2000 0 1000 2000 5000 10000 コンポーネント数 18

リフレクション処理 : 結果 Seasar >(3 倍 )> Spring 1000 回で 1300ms 理由 Seasar はリフレクションキャッシュ処理を独自で実装しています Spring の BeanWrapperImpl は JDK の Introspector を使用しています この違いが速度差となっていると思われます キャッシュ実装の違い Seasar: HashMap Spring: WeakHashMap 19

Seasar のコンテナ init 処理 Seasar ではコンテナ生成直後に init 処理を行うことができます 先ほどまではコンテナの init 処理を行っていませんでした init 処理を行わない場合は 1 度目にコンポーネントを取得したタイミングで そのコンポーネントがインスタンス化されます init 処理では singleton のコンポーネントを作成することができます singleton とは コンポーネント生成は最初 1 度だけで その後は最初に生成したコンポーネントを返すこと 20

Seasar のコンテナ init 処理 実際の案件では アプリケーション起動時に init 処理で singleton のコンポーネントを生成した方が効率的です Spring にはこのような機能はありません init 処理を含めた場合のコンテナ生成でのパフォーマンスを見てみましょう Seasar: コンテナ生成 + init Spring: コンテナ生成 21

Seasar のコンテナ init 処理 コンテナ生成 ( + init 処理 ) 6000 5000 4000 ミリ秒 3000 2000 Seasar Spring 1000 0 1000 2000 5000 10000 コンポーネント数 22

Seasar Spring Seasar のコンテナ init 処理 : 結果 理由 init 処理では singleton のオブジェクトを生成しているだけなので それほど時間が掛かりません コンテナ作成時の速度は Seasar の方が速いため init でのオーバーヘッドをカバーできます 23

では... create + init した場合での コンポーネント取得パフォーマンスは? 24

create + init した後のコンポーネント取得処理 14000 12000 10000 ミリ秒 8000 6000 4000 Seasar Spring 2000 0 1000 2000 5000 10000 コンポーネント数 25

結果 Seasar >>>>>>> (60~200 倍 ) >> >>>>>>>>>>> Spring 1000 個で 1500ms 実際の案件ではアプリケーション初期化時に create + init 処理を行っているので これが現実のプロジェクトで起こる結果を反映しています ただし コンテナから 2 回目に取り出すときは Seasar も Spring もキャッシュしたオブジェクトを返すだけなので 差は付きません 26

prototype 今までは singleton の場合でした 今度は prototype の場合を見てみましょう prototype とは コンポーネントを取得するたびに新たに生成することです prototype でも 1 度目の取得は singleton と同様に圧倒的な差が出ます 2 度目の取得で比べてみましょう 27

prototype prototype で 2 度目のコンポーネント取得 900 800 700 600 ミリ秒 500 400 300 200 Seasar Spring 100 0 1000 2000 5000 10000 コンポーネント数 28

prototype: 結果 Seasar >(3~5 倍 )> Spring 1000 個で 130ms 理由 Spring では対象となるオブジェクトに加えて BeanWrapperImpl を毎回作っていますが Seasar では対象となるオブジェクトしか作りません これが原因の 1 つかもしれません 29

DI (Manual) 次は DI 処理について見てみましょう DI とは あるコンポーネントが必要とする他のコンポーネントを コンテナがセットしてあげることです ( ざっくり ) 現実的な状況を反映させるため 最初にコンテナ生成と init を実行した上で比較しています コンテナへコンポーネントを 2000 個登録しています 2 個で 1 組です 30

DI (Manual) コンテナ生成 (Seasar は init を含む ) 3500 3000 2500 2000 ミリ秒 1500 1000 Seasar Spring 500 0 31

DI (Manual): 結果 Seasar < Spring 差は 600ms 前回コンテナ生成を比較した場合はほぼ一緒でしたが... 32

DI (Manual): 結果 理由 今回 2000 個のコンポーネントでコンテナ生成した場合は 600ms 差が出ています この差はリフレクションキャッシュによるものです 前回より 1000 個余分にキャッシュしていることが今回の 600ms の差につながっています Seasar でリフレクションキャッシュ 1000 個と 2000 個を作成する時間の差が 400ms でしたので 若干違いますがほぼその差と思われます 差が大きくないのと 初期化時の処理であることを考えると 現実にはあまり問題にならないと思います 33

DI (Manual) 今度は実際にユーザに影響する部分である DI したコンポーネントを取得する処理を見てみましょう 34

DI (Manual) DI したコンポーネントを取得 (1000 個 ) Manual DI singleton 3000 2500 2000 ミリ秒 1500 1000 500 Seasar Spring 0 35

DI (Manual): 結果 Seasar >>>>>> (100 倍 ) >>>>> >>>>>>>>> Spring 1000 セットで 2400ms DI 無しの場合と比べると... 今回は 2000 個から 1000 個取り出していますが 1000 個から 1000 個取り出すのと速度は同じですので そのときと比べてみましょう DI 無しの場合は 60 倍 今回は 100 倍 DI することによってさらに差が開いています 36

DI (Manual): 結果 理由 DI するときに プロパティに対してリフレクションでアクセスしています リフレクションを行うクラスの性能差が一因と思われます リフレクションでのアクセスがどれくらいか見てみましょう 1 プロパティへ set, get して測定しました Seasar: BeanDescImpl Spring: BeanWrapperImpl 37

リフレクション リフレクションでのプロパティアクセス 600 500 400 ミリ秒 300 200 Seasar Spring 100 0 1000 2000 5000 10000 回数 (set,get で 1 回 ) 38

Seasar > (4~8 倍 ) > Spring 1000 回で 100ms リフレクション : 結果 理由 BeanDescImpl と BeanWrapperImpl の差と思われます BeanWrapperImpl ではネストしたプロパティをサポートしており それ関連のオーバーヘッド ( 文字列操作とか ) が大きいと思われます 39

次は prototype で明示的に DI を指定した場合の 2 度目のアクセスについてです 40

DI したコンポーネントを取得 (1000 個 ) Manual DI prototype 250 200 150 ミリ秒 100 50 Seasar Spring 0 41

結果 Seasar >(3 倍 )> Spring 1000 セットで 150ms DI しない場合でも prototype での 2 度目の取得は 3~5 倍の差だったので DI 処理のぶん更に差が出ると思いましたが 想定したほどではありませんでした 42

autowire 設定ファイルを少しでも少なくするために autowire というものがあります 設定ファイルに DI を指定する property タグを書かなくて良くなります autowire には幾つか種類がありますが ここでは型による DI を使用しています 43

autowire DI したコンポーネントを取得 (1000 個 ) autowire bytype singleton 7000 6000 5000 4000 ミリ秒 3000 2000 Seasar Spring 1000 0 44

autowire: 結果 Seasar >>>>>>>>>>>>>>> >>>>>>>>>>(300 倍 )>>>>> >>>>>> Spring 1000 セットで 6000ms Manual では 100 倍の差でしたが Auto にすると更に 3 倍の差が付きました 45

autowire: 結果 理由 autowire 時には DI 対象を探すロジックが実行されます Spring では DI の度に 毎回コンテナへ登録されている全てのオブジェクトへアクセスします コンテナには 2000 個登録されていて 1000 回 DI しているので 2000 * 1000 回コンポーネント定義へアクセスしています Seasar はコンポーネントを登録するときにクラスの型をキー情報としてハッシュテーブルへ登録しているので DI の度に 1 回のアクセスで済みます つまり DI の度に List へ全件アクセスするのか HashMap へキーでアクセスするのかの差なので 差が付いて当たり前と言えるでしょう 46

autowire で prototype の場合はどうでしょうか? 2 回目のコンポーネント取得時 47

DI したコンポーネントを取得 (1000 個 ) autowire bytype prototype 3000 2500 2000 ミリ秒 1500 1000 500 Seasar Spring 0 48

結果 Seasar >>>> (35 倍 ) >>>>> Spring 1000 セットで 2300ms 理由 singleton と同じで DI 対象を探すロジックの差でしょう singleton ほどではありませんが 大きな差が出ました 49

AOP AOP とは バイトコードを操作しもともとの処理をカスタマイズするもの ( ざっくり ) AOP を掛けたメソッドを実行して 速度差を見てみましょう 今回の AOP は文字列を返すだけの 非常にシンプルなものです だからこそ AOP のオーバーヘッドがわかりやすいと思います 10,000,000 回メソッドを実行 Seasar は Javassist Spring は CGLIB (DynamicProxy よりも速い ) 50

AOP AOP を仕掛けたメソッドを実行 3500 3000 2500 2000 ミリ秒 1500 1000 Seasar Spring 500 0 51

AOP: 結果 Seasar >(3~4 倍 )> Spring 10,000,000 回で 2400ms 理由 Seasar は 2.1 までは CGLIB で 2.2 からは Javassist に変えて 約 3 倍速くなったことがあります CGLIB を使うと殆どチューニングの余地がありませんが Javassist にはチューニングの余地があります Seasar ではかなりのチューニングを行っているので 速くなっていると思われます 52

AOP weaving AOP を組み込むバイトコード操作を weaving と呼んでいます この weaving もパフォーマンスに与える影響があると考えたため 測定してみました 53

AOP weaving まずは weaving するクラスを直接呼び出して 速度差を比較しました Seasar: AopProxy Spring: ProxyFactory 54

AOP weaving AOP の Weaving 140000 120000 100000 ミリ秒 80000 60000 40000 Seasar Spring 20000 0 1000 2000 5000 10000 回数 55

AOP weaving: 結果 Seasar >(3 倍 )> Spring 1000 回で 8000ms 理由 Javassist と CGLIB でのバイトコード weaving の速度差と思われます AOP の weaving にかかる絶対時間が大きいことがわかります (1000 個で 8 秒!) 56

次は 登録されているコンポーネントへまとめて Aspect を仕掛けて コンテナを生成してみます まとめて Aspect を仕掛ける機能 Seasar: AspectAutoRegister Spring: AutoProxyCreator これらを使ってみました 57

AOP 自動登録でのコンテナ生成 300000 250000 200000 ミリ秒 150000 100000 Seasar Spring 50000 0 1000 2000 5000 10000 回数 58

結果 Seasar >>> (15~60 倍 ) > > > Spring 1000 個で 15000ms 理由 リフレクション情報のキャッシュ AOP weaving やはり AOP weaving は DI コンテナの処理の中では重い部類に入ることがわかります 59

補足情報 Spring は ( 今回使用した方法で )AOP を登録すると コンテナ生成時にリフレクション情報をキャッシュしコンポーネントを生成するようです 1 度目のコンポーネント取得時に発生していた負荷がコンテナ生成時に寄っています そのぶん コンポーネント取得時の速度は Seasar と同じくらいに速くなっています 60

まとめ DI という同じ技術を実装してこれほどの差が出るのはかなり驚きです ある程度 原因も指摘しているので この結果を元に Spring のチューニングに役立ててもらえれば幸いです この結果およびテストプログラムはオープンソースとして公開する予定です 61

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