09 Executable Model
この記事は 赤帽エンジニア Advent Calendar 2019 18 日目の記事です。
07 MVEL で書いたように、Drools 7 から Executable Model というオプションが利用可能となっています。これは kjar のビルド時点で DRL を Java クラス化し、実行時の性能を良くしよう、というものです。最新バージョンでは多数のバグがフィックスされ、安定して使えるようになってきました。
利用方法は簡単です。-DgenerateModel=YES というオプションを mvn に付けるだけです。
$ mvn clean install -DgenerateModel=YES
これで Executable Model を使用した kjar がビルドされます。 kjar の利用方法については 05 KJAR を参照ください。
ではサンプルでやってみましょう。
git clone https://github.com/tkobayas/drools-blog.git
今日のエントリはその中の 09_executable-model です。
kjar のプロジェクトはその中の drools-hello-kjar 、実行するテストクライアントのプロジェクトは drools-hello-client です。
drools-hello-kjar の Sample.drl の中には単純なルールが 1000 個入っています。
rule "rule0" when $p : Person( age >= 0 && age < 5 ) then resultList.add( kcontext.getRule().getName() + " : " + $p ); end rule "rule1" when $p : Person( age >= 5 && age < 10 ) then resultList.add( kcontext.getRule().getName() + " : " + $p ); end ...
まずは普通にビルドしてみましょう。
$ cd drools-hello-kjar $ mvn clean install
そしてテストします。こちらは 1000 個のファクトを投入して逐一 fireAllRules します。
$ cd drools-hello-client $ mvn test ... elapsed time for load = 4828ms elapsed time for execution = 1272ms
次は executable-model でビルドします。
$ cd drools-hello-kjar $ mvn clean install -DgenerateModel=YES
"target/generated-sources" ディレクトリを覗いてみると分かりますが、大量の Java コードが生成されています。
$ tree target/generated-sources/ target/generated-sources/ └── drools-model-compiler └── main └── java ├── org │ └── example │ ├── LambdaPredicate00B17E09F368ECC48D2C9D8501927757.java │ ├── LambdaPredicate00BE0AF256D7A54ACF309C5375D52A02.java │ ├── LambdaPredicate00CD93B16506F18C96F2AF35D0A99C82.java │ ├── LambdaPredicate00E858E9381395E6402284C160581DD8.java │ ├── LambdaPredicate011DF5425A3D14FE82E6277403412AAF.java │ ├── LambdaPredicate012F668EF4CBE53CC643A6161D4CDFC9.java ...
もう一度テストしてみましょう。
$ cd drools-hello-client $ mvn test ... elapsed time for load = 3979ms elapsed time for execution = 632ms
速くなってますね!
ただし、あくまでこれは人工的なルールでの人工的なテストです。ルールのパフォーマンスは様々な条件が影響しますので、測定時には実際に使うルール、テストシナリオで計測するようにしてください。