我们目前正在使用x++;
where x
is anInteger
和 not an进行一些迭代和其他操作int
。
操作可能会在我们系统上的某些用户操作中重复,但不会像数学应用程序那样过于复杂或繁多,每个用户事务最多可重复 10000 次。
这种拆箱和后来的装箱会影响我们的性能一些明显的毫秒吗?
http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html
“结果列表的性能可能很差,因为它在每次获取或设置操作时都会装箱或取消装箱。对于偶尔使用它足够快,但在性能关键的内部循环中使用它是愚蠢的。
那么什么时候应该使用自动装箱和拆箱呢?仅当引用类型和原语之间存在“阻抗不匹配”时才使用它们,例如,当您必须将数值放入集合中时。对于科学计算或其他对性能敏感的数字代码,不适合使用自动装箱和拆箱。Integer 不能替代 int;自动装箱和拆箱模糊了原始类型和引用类型之间的区别,但它们并没有消除它。”
是的,有性能影响。生成的等效代码++x
涉及每次创建一个新的 Integer 对象。x++
另外创建一个临时变量来存储先前的整数引用和一些操作。您可以通过反汇编类文件来验证这一点。
自动装箱的速度取决于您使用的 JVM 版本、您使用的实际数字的范围以及您的 GC 设置。请参阅这篇关于(取消)拳击性能的非常有趣的深入文章。
基本上,JVM 缓存了许多 Integer 对象,因此它不需要每次都创建“通用”对象。您可以配置此缓存大小。
至于具体问题:如果您使用原语而不是自动装箱,您的操作会慢几毫秒吗?这完全取决于列表的大小以及它被调用的频率。测试原始替代方案的性能应该很容易(我认为!)。