可以在应用程序中过于频繁地使用非原始的Integer / Long数据类型,会影响性能吗?

时间:2011-02-27 13:53:48

标签: java performance

我在我的应用程序中经常使用Long / Integer数据类型来构建Generic数据类型。我担心使用这些包装器对象而不是原始数据类型可能对性能有害,因为每次需要创建一个昂贵的操作对象。但似乎我别无选择(当我必须使用带有仿制药的原始药物而不是仅仅使用它们 但是,如果你可以建议我能做些什么来改善它,那还是会很棒的。或任何方式,如果我可以避免它??

这也可能是什么缺点?

建议欢迎!

4 个答案:

答案 0 :(得分:7)

在我之后重复。 “用Java创建对象并不是一项昂贵的操作”

您过早地优化了应用程序。更好的方法是使用IntegerLong以自然方式实现它,然后对其进行分析以确定瓶颈所在。如果分析器告诉您使用IntegerLong是性能问题,那么然后会考虑解决此问题的方法。


如果您确定IntegerLong确实存在问题,可以采取以下措施:

  • 寻找实现原始类型“集合”的类库;例如宝库。但请注意,此类集合类型的API不会java.util.Collection及其后代兼容。

  • 使用Integer.valueOf(int)Long.valueOf(long)而不是new Integer(int)new Long(long)valueOf方法使用常用对象的缓存来减少对象创建的数量。


@Rex Kerr的评论是,这是一个可怕的建议。他(我认为)说OP应该优化他的应用程序以减少IntegerLong知道这将是一个性能问题之前的使用。我不同意。

  • 此时(当他提出问题时),OP并不知道他的应用程序需要优化。如果应用程序在没有任何优化的情况下“足够快”运行,那么任何开发人员花在优化上的时间都会花在其他事情上。

  • 此时,OP不知道 的性能瓶颈在哪里。如果他们不处理这些值,那么优化这方面将是浪费时间。请注意,一般来说,依靠 直觉来告诉您瓶颈在哪里或可能存在瓶颈是个坏主意。

  • @Rex Kerr认为,由于IntegerLong的过度使用,修改/重组代码以修复性能问题需要做大量的工作。这根本不是真的。一个体面的IDE可以很容易地在中小型应用程序中进行这种更改。

答案 1 :(得分:1)

如果您有许多集合或大型集合,则可能会出现性能问题。请参阅http://www.cs.virginia.edu/kim/publicity/pldi09tutorials/memory-efficient-java-tutorial.pdf

如果您有许多集合,大型集合或许多大型盒装类型集合(例如Integer,Long),则有其他选择:一个是来自http://mahout.apache.org的Mahout集合库。 Mahout集合有开放的哈希表,它解决了链接PDF中的许多问题,以及存储小整数等的集合。如果GPL不打扰你,则另一个是Trove。

如果您不确定您的代码是否符合“很多”,“大”或“多大”的条件,那么请务必使用分析器查看正在发生的事情。

答案 2 :(得分:1)

像其他人一样说,

  

过早优化是根源   恶

尽可能地说prefer primitive types to boxed types

更新:可能还会补充说,根据开发人员使用高性能代码(如分布式缓存),拳击确实会经常成为性能问题。我还使用过高性能的应用程序。但是从来没有把拳击确定为一个有价值的优化场所。

答案 3 :(得分:0)

您最好分析您的应用程序并查看瓶颈和热点的位置。这些在大多数情况下很难预测。恕我直言如果你没有测量,你只是猜测。

但是,如果您确定在集合中使用原语会更有效率,我建议您尝试http://trove.starlight-systems.com/它可以在真正重要时产生重大影响,但在90%的情况下,它不会