Производительность примитивных и не примитивных типов данных в Drools - PullRequest
0 голосов
/ 28 июня 2018

Мне было интересно, как это повлияет на производительность и использование памяти при использовании примитивов по сравнению с не примитивными типами данных в Drools.

В документации указано:

8.8.6. Замечание об автобоксах и примитивных типах Drools пытается сохранить числа в их примитивной или объектной оболочке, поэтому переменная, привязанная к примитиву int, когда используется в блоке кода или выражение больше не будет нуждаться в ручной распаковке; в отличие от Drools 3.0 где все примитивы были автоматически упакованы, что требует ручной распаковки. переменная, связанная с оберткой объекта, останется как объект; существующие правила JDK 1.5 и JDK 5 для обработки автобокса и распаковки применить в этом случае. При оценке ограничений поля система пытается привести одно из значений в сопоставимый формат; так Примитив сравним с обёрткой объекта.

По сути, в моих правилах есть такие условия:

$someObj : SomeObj( someIntOrIntegerField > 15 )

и накопления следующим образом:

$total : Double() from accumulate (
                 SomeObj(
                    $someIntOrIntegerField : someIntOrIntegerField) over window:time( 1h ),
                 sum( $someIntOrIntegerField ) )

Что я понимаю, так это то, что Drools делегирует принуждение в JVM и не выполняет никакой упаковки / распаковки. Это правда? Поскольку я участвую в гонке со временем за пару миллисекунд, мне было интересно, что будет быстрее:

int someIntOrIntegerField;

или

Integer someIntOrIntegerField;

Обратите внимание, что мой вопрос о том, есть ли бокс / распаковка, о которой я не знаю в Drools, и о том, будут ли примитивы или Object s быстрее и эффективнее (с точки зрения памяти), опять же, ограничены Drools , В противном случае, хороший ответ в общем объеме Java: https://softwareengineering.stackexchange.com/a/203971

1 Ответ

0 голосов
/ 28 июня 2018

Ответственная часть вашего вопроса такова:

Что я понимаю, так это то, что Drools делегирует принуждение в JVM и не выполняет никакой упаковки / распаковки. Это правда?

Нет, это не правда. JVM не выполняет преобразование в автоматическую коробку / распаковку. Компилятор (source -> bytecode) отвечает за вставку вызовов (например) Integer.valueOf(int) и Integer.intValue() в соответствующую точку в байт-кодах. Вы можете проверить это, используя javap для проверки файлов ".class".

В случае с Drools компилятор создает файлы ".class", которые имеют любые необходимые автоматические / распаковки в байт-кодах. Я думаю, что приведенная вами документация на самом деле означает, что стратегия компилятора Drools для автобоксирования / распаковки изменилась ... после Drools 3.0

...