DBFlute: リフレクションレス

> (DBFLUTE-343){Java/C#}:
> 検索結果マッピング時のEntityの生成をリフレクションレスに

もともとDBFluteはEntityの「セッタ呼び出し」はリフレクションレス
でしたが、Entityの生成(new Entity)もリフレクションレスにってのが
この項目です。その結果がこちらです。
http://d.hatena.ne.jp/koyak/20081011/1223699743

詳細な検証、本当にありがとうございます。感謝感謝です。
検証はC#版ですが、Java版でも基本的には同じです。
DBFluteは徹底したパフォーマンスを追求しています。
その結果があらわれたようですね。
この記事には載っていませんが、個人的に聞いてみたところ、
セッタやEntity生成をリフレクション方式に戻すと2秒から3秒
遅くなるようです。(記事中の20013件検索にておいて)
どうやらリフレクションレスはかなり効果があるようです。

リフレクション以外にも細かいところでチューニングを行っています。
それによって前バージョンよりも大幅に速くなっています。
具体的には:
実は、S2Daoにおいて、RelKeyがたくさん付いたEntityでそのRelationを
取得しないSQLで検索した際でも、Relationの値を取得しはしないものの、
最低限のRelation処理が走るためちょっと遅くなるということに気付きました。
これはS2Dao的には仕方のない処理ではあります。
しかし、DBFluteではその処理の前に「setupSelectしたRelationか否か」
を判断することが可能なため、チューニングすることが可能でした。
CBでsetupSelectされてないRelationはその処理が走らないように
調整を致しました。結果、今回のEntity生成のリフレクションレスよりも
より大きいチューニングとなりました。
(DBFlute専用のマッピング処理クラスを作ってしまいました)

DBFlute特有のこれらのチューニングは、
画面リクエスト上の20件や50件程度の検索ではほとんど差は
ありませんが、ワンリクエストでSQLがたくさん発行されるとか、
取得カラムの数が膨大だとか、バッチ処理での検索とかにおいて
絶大な効果を発揮します。

そして、記事でもありますが、DBFluteの検索において最速は
「外だしSQL + カーソル検索」です。
DBFluteのカーソル検索はこれまた特徴的で、
「Entityへマッピングされた状態をコールバックで捕まえる」ではなく、
「Entityへのマッピングをせず、タイプセーフなResultSetのラッパ」で
コールバック処理を行います。よって、最速であり、かつ、安全です。
http://dbflute.sandbox.seasar.org/contents/outside-sql/cursor.html