JDBC、S2JDBC、S2Dao、JPA(Hibernate)、Domaのパフォーマンス比較

データベースにH2を使ってCRUDのパフォーマンス比較をしてみました。それぞれ3回実行して真ん中の値を使っています。コードや使用しているライブラリはリポジトリにあります。
https://www.seasar.org/svn/doma/trunk/or-mapper-benchmark/

10000件SELECT
   529,419,874 (nanoTime) : DomaSelectOwnerTest
   137,686,988 (nanoTime) : JdbcSelectOwnerTest
 1,048,970,551 (nanoTime) : JpaSelectOwnerTest
   303,612,949 (nanoTime) : S2DaoSelectOwnerTest
   750,473,864 (nanoTime) : S2JdbcSelectOwnerTest
10000件INSERT(主キーの採番にシーケンスを利用)
 1,822,953,917 (nanoTime) : DomaInsertSequenceTest
 1,663,161,970 (nanoTime) : JdbcInsertSequenceTest
 2,050,964,995 (nanoTime) : JpaInsertSequenceTest
 1,931,597,557 (nanoTime) : S2DaoInsertSequenceTest
   931,245,596 (nanoTime) : S2JdbcInsertSequenceTest
10000件UPDATE
 2,939,564,698 (nanoTime) : DomaUpdateTest
 1,293,256,508 (nanoTime) : JdbcUpdateTest
 3,011,931,464 (nanoTime) : JpaUpdateTest
 2,688,868,659 (nanoTime) : S2DaoUpdateTest
 1,651,478,711 (nanoTime) : S2JdbcUpdateTest
10000件DELETE
 1,679,233,738 (nanoTime) : DomaDeleteTest
   819,642,554 (nanoTime) : JdbcDeleteTest
 3,492,169,610 (nanoTime) : JpaDeleteTest
 1,762,726,126 (nanoTime) : S2DaoDeleteTest
   879,621,774 (nanoTime) : S2JdbcDeleteTest

Doma、思ったほどには速くないなぁ。。。検索はまあこんなものかなと思います。S2Daoより遅くてS2JDBCより速い。
更新系はS2Daoとほぼ同じ。Domaが遅いというかS2JDBCが速すぎる気がします。やっていることはそんなに違わないはずなのにこの差は何だろう。キャッシュを使っていなことが差になっているのか、SQLのノードを作っているのがオーバーヘッドなのか。

追記

とりあえずわかっているのは、

  • バッチの更新系ではそれほど差がない
  • S2JDBCはPreparedStatementをキャッシュする仕組みがある。この影響かと思ってキャッシュしないようにしてみたが変化がない(変化がないのはH2だからかもしれないが、いずれにしてもS2JDBCDomaで性能差が生じていることの要因ではなさそう)

あやしいのは

  • S2JDBCトランザクション中は同じConnectionを使うように最適化されていること。パフォーマンス比較のコードではS2のコネクションプールを使っているが、Connectionをプールから取得したりプールへ返却したりする際にsynchronizedされるのでこれが影響大きいのかも? 更新系のテストケースでは、S2JDBCは取得と返却をそれぞれ一度しか行わないが、Domaは10000回以上行う。
追記2

この比較にどれだけ妥当性があるかというとあんまりないと思いますが、ひとつの目安です。Domaが見当違いに遅かったら不具合の可能性があるので。