(その9)AOP含めたパフォーマンス比較を再度

ちょっと数字を出す事の責任を感じてます…。
前置きさせて下さい。

  1. ベースとなっているGuice付属のソースのJavaDocコメントには、以下の文で始まっています。"A semi-useless microbenchmark."
  2. 誤解を恐れつつ言えば、このマイクロベンチマークは「大豆100粒を箸で移す競争」みたいなものではないかと。速いにこした事はないですが、それがどれだけ食事の速さにつながるかは、料理や食べ方次第で全く違う、という。…いや、全然うまい事言えてないですね。

という事で、コンテナからのインスタンス取得処理と、取得した1つのインスタンスをひたすら呼び出す処理を分けて計測しました。前者を全フレームワークで実行→後者を全フレームワークで実行、という順序です。

- get instance from factory -
Spring: 1,891 creations/s
Guice: 38,789 creations/s
S2: 20,712 creations/s
- call service with AOP -
Spring: 98,840 calls/s
Guice: 930,736 calls/s
S2: 1,156,739 calls/s


- get instance from factory -
Spring: 1,942 creations/s
Guice: 38,095 creations/s
S2: 21,331 creations/s
- call service with AOP -
Spring: 99,279 calls/s
Guice: 902,730 calls/s
S2: 1,171,150 calls/s


- get instance from factory -
Spring: 1,939 creations/s
Guice: 41,017 creations/s
S2: 21,335 creations/s
- call service with AOP -
Spring: 99,063 calls/s
Guice: 920,408 calls/s
S2: 1,172,124 calls/s

コードはそのまま公開すると問題があるかも知れないので、差分のパッチを以下に公開しました。
上記パフォーマンス計測コード

どなたか、SpringをAspectJでもやって下さったり、より適切に修正して下さると嬉しいです。あと、このコードだとSpringはDynamicProxyを使って動きます。(ここを見ると、どっちが速いかは微妙なようですが、全然違ったらまた公平な計測にならないですね。でもDynamicProxyの選択肢を残しているのはSpringのポリシーだから良いのかな)。

追記

koichikさんのコメントによるcontainer.init()の追加を行って計測しましたが、以下の通り有意な差は(私の環境では)見られませんでした。

// container.init()無し
S2: 21,123 creations/s
S2: 21,992 creations/s
S2: 21,843 creations/s
// container.init()有り
S2: 21,052 creations/s
S2: 21,838 creations/s
S2: 21,920 creations/s