コンパイルスピード
DBFluteのコンパイルスピード改善プロジェクトを立ち上げています。色々と分析して改善ポイントを見つけて、ほんの少しでも良くなればと。
今までもかなり頑張ってスリム化を心がけてきましたが、やっぱりコンパイルが遅い環境での実装って、ストレス溜まりますからね。まだまだやれることあるんじゃないかと思って。
1/3がLombok時間!?
その検証の中で、ちょっと気付いたものがあります。Lombokを入れると、コンパイル時間が50%アップしました。"アップ" って悪い方にってことです。
メモリ8GB の MacBook Air で、mvn -e clean compile を実行。24テーブル分のDBFluteクラスを自動生成済み。
// 検証で利用しているプロジェクト at Github
// (デフォルトではLombokなしの状態)
https://github.com/dbflute-test/dbflute-test-env-compilespeed
# Lombokなし - 1: 00m10s823ms - 2: 00m10s314ms - 3: 00m11s501ms => avg: 00m10s879ms - 1: 00m10s194ms - 2: 00m10s084ms - 3: 00m11s239ms => avg: 00m10s505ms # Lombokの依存を入れてみた - 1: 00m14s607ms - 2: 00m14s020ms - 3: 00m14s056ms => avg: 00m14s227ms - 1: 00m14s860ms - 2: 00m13s910ms - 3: 00m14s154ms => avg: 00m14s308ms # Lombokの @Data を Entity, Bhv, CB, CQ などで利用 - 1: 00m17s529ms - 2: 00m17s240ms - 3: 00m16s296ms => avg: 00m17s021ms
まあ、ざっくりまとめると...
o Lombokなし: 10秒ちょい
o Lombokの依存を入れてみた: 14秒ちょい
o @Data めっちゃ使ってみた: 17秒くらい
まったく差分がなくても2秒くらい掛かっているので、
(Mavenの起動時間も含まれている)
2秒ずつ引いて...
o Lombokなし: 8秒ちょい
o Lombokの依存を入れてみた: 12秒ちょい
o @Data めっちゃ使ってみた: 15秒くらい
12秒のうち、1/3がLombokの処理と言えるのかなと。
240テーブルだと?
もし、10倍の240テーブルだと、まだ試してないですが単純計算で...
o Lombokなし: 80秒ちょい
o Lombokの依存を入れてみた: 120秒ちょい
o @Data めっちゃ使ってみた: 150秒くらい
まあ、実際のプロジェクトで、このくらいになっていますので、そんなに大外れはしてないかと思います。
【追記】
400テーブル超えのプロジェクトで、lombokあり/なしで試してみたら、自動生成クラス部分のコンパイル時間、やはり "おそよ1/3" が lombok でした。(nabedgeさん、協力ありがとうございました)
けっこうでかいですね...しかも、アノテーションを使うとなおさら、使う量に依存すると思いますが、倍近くになっていますね。
まあ、ある程度は遅くなるだろうと思ってましたが、予想以上に遅いなって感じですね...
Lombokの処理対象から除外!?
なので、DBFluteの自動生成クラスは、Lombokの処理対象から除外する方が良いでしょう。(Lombokに除外設定があるのかわかっていませんが...情報求む)
...
ちなみに、jfluteは普段 Lombok は使わってないです。個人的には環境負荷をかけてまでやりたいことじゃないなって感覚なので。(これはあくまでjflute個人的にはという感じで)
別にすでに使っている現場でやめた方がいいとは言いませんが、ただひたすら自動生成との相性が悪いので、なんとか除外設定をして欲しいなと思います。
自動生成クラスだけ独立したプロジェクトにして、Lombokが入らないようにするとか…ExクラスでLombok使えなくなるけど、その場面で使うことはあまりないはず。