Drools中原始数据类型与非原始数据类型的性能

时间:2018-06-28 11:36:56

标签: java drools

我想知道与Drools中的非原始数据类型相比,使用原始类型会对性能和内存使用产生什么影响。

documentation中指出:

  

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是否会更快,更高效(就内存而言),这是有限的流口水。否则,在一般的Java范围内会有一个很好的答案:https://softwareengineering.stackexchange.com/a/203971

1 个答案:

答案 0 :(得分:0)

您的问题的一部分是可以回答的:

  

据我了解,Drools将强制委派给JVM,并且不进行任何装箱/拆箱。这是真的?

不,这不是真的。 JVM不执行自动装箱/拆箱转换。它是(源->字节码)编译器,负责将对Integer.valueOf(int)Integer.intValue()的调用插入到字节码中的相应点。您可以使用javap检查“ .class”文件来进行验证。

对于Drools,编译器生成“ .class”文件,这些文件在字节码中具有任何必要的自动装箱/拆箱。我认为您引用的文档实际上意味着Drools编译器的自动装箱/拆箱策略已更改……自Drools 3.0起