自动拆箱和自动装箱是否会导致性能问题?

12

我们目前正在使用 x++; 进行一些迭代和其他操作,其中 x 是一个 Integer 而不是一个 int

这些操作可能会在我们系统中某些用户操作期间重复执行,但不会像数学应用程序那样复杂或繁琐,每个用户事务最多重复执行1万次。

这种拆箱和再封箱是否会对我们的性能产生明显的毫秒级影响?


1
应用Erhan的答案到你的情况中,除非你必须在增量之间存储值到一个“Collection”中,否则使用原始的“int”。你需要提供更多的细节或代码来允许任何更深入的分析。 - David Harkness
@David 我同意,但即使是在集合方面,当涉及到原始类型时,我个人经常使用GNU Trove(http://trove.starlight-systems.com/)。虽然我的偏见恰好在于计算密集型程序,但我很少使用Java的原始类型包装器,因为它们在时间和内存上的差异非常重要。 - Michael McGowan
3个回答

19

http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

结果列表的性能可能会很差,因为每次getset操作都需要装箱或拆箱。它对于偶尔使用来说足够快,但在性能关键的内部循环中使用它是愚蠢的。

那么什么情况下应该使用自动装箱和拆箱呢?仅在引用类型和基本类型之间存在“阻抗不匹配”时使用它们,例如,当你必须将数值放入集合中时。在科学计算或其他性能敏感的数值代码中,使用自动装箱和拆箱是不适当的。一个Integer不能替代一个int;自动装箱和拆箱模糊了基本类型和引用类型之间的区别,但并没有消除它。


1

是的,这会对性能产生影响。对于++x生成的等效代码涉及每次创建一个新的Integer对象。x++还会创建一个临时变量来存储先前的整数引用,并进行一些操作。您可以通过反汇编类文件来验证这一点。


1

自动装箱的速度取决于您使用的JVM版本、您正在处理的实际数字范围以及您的GC设置。请参阅this这篇非常有趣的深入文章,了解(取消)装箱性能。

基本上,JVM会缓存一些整数对象,因此它不需要每次都创建“常见”的对象。您可以配置此缓存大小。

至于具体问题:如果您使用原始类型而不是自动装箱,您的操作是否会比毫秒慢?这完全取决于列表的大小以及调用频率。测试原始类型的替代性能应该很容易(我认为!)。


链接中的信息很有用! - Ogre Psalm33

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接