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