我在我的应用程序中经常使用Long
/ Integer
数据类型来构建Generic数据类型。我担心使用这些包装器对象而不是原始数据类型可能对性能有害,因为每次需要创建一个昂贵的操作对象。但似乎我别无选择(当我必须使用带有仿制药的原始药物而不是仅仅使用它们
但是,如果你可以建议我能做些什么来改善它,那还是会很棒的。或任何方式,如果我可以避免它??
这也可能是什么缺点?
建议欢迎!
答案 0 :(得分:7)
在我之后重复。 “用Java创建对象并不是一项昂贵的操作”。
您过早地优化了应用程序。更好的方法是使用Integer
和Long
以自然方式实现它,然后对其进行分析以确定瓶颈所在。如果分析器告诉您使用Integer
和Long
是性能问题,那么然后会考虑解决此问题的方法。
如果您确定Integer
和Long
确实存在问题,可以采取以下措施:
寻找实现原始类型“集合”的类库;例如宝库。但请注意,此类集合类型的API不会与java.util.Collection
及其后代兼容。
使用Integer.valueOf(int)
和Long.valueOf(long)
而不是new Integer(int)
和new Long(long)
。 valueOf
方法使用常用对象的缓存来减少对象创建的数量。
Integer
和Long
在知道这将是一个性能问题之前的使用。我不同意。
此时(当他提出问题时),OP并不知道他的应用程序需要优化。如果应用程序在没有任何优化的情况下“足够快”运行,那么任何开发人员花在优化上的时间都会花在其他事情上。
此时,OP不知道 的性能瓶颈在哪里。如果他们不处理这些值,那么优化这方面将是浪费时间。请注意,一般来说,依靠 直觉来告诉您瓶颈在哪里或可能存在瓶颈是个坏主意。
@Rex Kerr认为,由于Integer
和Long
的过度使用,修改/重组代码以修复性能问题需要做大量的工作。这根本不是真的。一个体面的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%的情况下,它不会