我想知道与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
答案 0 :(得分:0)
您的问题的一部分是可以回答的:
据我了解,Drools将强制委派给JVM,并且不进行任何装箱/拆箱。这是真的?
不,这不是真的。 JVM不执行自动装箱/拆箱转换。它是(源->字节码)编译器,负责将对Integer.valueOf(int)
和Integer.intValue()
的调用插入到字节码中的相应点。您可以使用javap
检查“ .class”文件来进行验证。
对于Drools,编译器生成“ .class”文件,这些文件在字节码中具有任何必要的自动装箱/拆箱。我认为您引用的文档实际上意味着Drools编译器的自动装箱/拆箱策略已更改……自Drools 3.0起