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だからかもしれないが、いずれにしてもS2JDBCとDomaで性能差が生じていることの要因ではなさそう)
あやしいのは
追記2
この比較にどれだけ妥当性があるかというとあんまりないと思いますが、ひとつの目安です。Domaが見当違いに遅かったら不具合の可能性があるので。