SYSTEM DEVELOPMENT

STUDY GROUP

mybatisのパフォーマンス比較(List vs ResultHandler)

mybatisで自動生成したtestエンティティクラスに対してMapperクラスに以下の2種類のメソッドを作成して速度を比較してみた。

  1. List<test> getTestList();
  2. void getTestHandler(ResultHandler context);

※XML側の設定は同じ。6カラム程度のテーブルからlimit1000で取得している。
今回の例では取得したデータを最終的にwriterで出力する。表題とそこまで関係ないところは色々省略で。(データ区切ってなかったりとか)
処理時間はコンソールに出力されるstart,endログの時間から計算します。
まずは1番目から
log.info(–start–)
List<test> test = getTestList();
for(Test test : list){
write(test.getData1);
write(test.getData2);
write(test.getData3);
write(test.getData4);
write(test.getData5);
write(test.getData6);
write(“\r\n”) //改行
}
log.info(“–end–“)
この方法では一回取得データをすべてリストに格納し、その後リストの中身をどんどん書き出しています。
対して2番目は、
log.info(–start–)
getTestHandler(context -> {
Test test =  context.getResultObject();
write(test.getData1);
write(test.getData2);
write(test.getData3);
write(test.getData4);
write(test.getData5);
write(test.getData6);
write(“\r\n”) //改行
});
log.info(“–end–“)
こっちはリストに格納せず、取得したデータを順次書き出しています。
最終的にやることは同じですが、どうやら見かけ上は2番目のほうが一旦リストに詰める過程がない分速そうですよね。
 
しかし結論を言ってしまうと1番のほうが1秒くらい速いんです。(7~8倍くらいの差)
 
mybatisのリスト格納がどうやって行われているのか知らないのでテキトーな推測なのですが、ResultHandlerのカーソル変更がやたら重いんですかね?
log.infoでもっと細かくロギングして時間計測すればどこが原因か特定できそうですが、あまり興味がないので私の方ではここまでにしておきます。

menu