繁体   English   中英

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

[英]Performance of primitive vs. non-primitive data types in Drools

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

文档中 ,声明:

8.8.6。 关于自动装箱和基元类型的注意事项Drools尝试将数字保留为它们的基元或对象包装形式,因此,在代码块或表达式中使用绑定到int基元的变量时,不再需要手动拆箱。 与Drools 3.0不同,在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的速度和效率(就内存而言)是否会更快,更有效(再次限制于Drools)。 否则,在一般的Java范围内会有一个很好的答案: https : //softwareengineering.stackexchange.com/a/203971

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM