说我有一个非常轻量级的对象:
public class Point {
public int x;
public int y;
public Point(int ax, int ay){
x = ax;
y = ay;
}
}
我需要非常频繁地计算距离 - 例如,在移动设备上的滚动事件期间,可能每秒发射几次。
如果每次使用新Point(a,b)使代码更清晰,更透明,那么性能是否足够重要,我应该考虑缓存一些引用并更新成员变量(而不是实例化) )?
答案 0 :(得分:5)
就我个人而言,每次你需要一个点时我都不会担心实例化这些对象。虽然是的,但缓存一些会更快一些,我同意它会使代码不那么干净。看看这篇Java性能优化书对于对象创建成本有何看法:https://www.safaribooksonline.com/library/view/java-performance-tuning/0596000154/ch04.html
基本上,如果旧的Pentium II每秒可以创建一百万个轻量级对象,那么鉴于今天的处理器/内存数量更快,我认为你没有什么可担心的。
答案 1 :(得分:2)
您可能还希望阅读以下资源,该资源总结了现代JVM中分配的性能成本以及使用与对象重用方案有许多相似之处的对象池的影响正在考虑。
http://www.ibm.com/developerworks/java/library/j-jtp01274/index.html
应考虑可能的JVM优化,例如以下引用所引用的优化。
JIT编译器可以执行其他优化,可以将对象分配的成本降低到零。
但是,我并不熟悉当今移动设备中使用的JVM实现,它们很可能与常规计算机上使用的实现不相上下。
在任何一种情况下,如果可能的话,通常不鼓励进行过早优化,除非有明显和所需的性能增益。
总而言之,除非您测量Point对象的分配成本占用太多时间,否则您不应该牺牲代码质量来进一步改进它。
答案 2 :(得分:0)
更新上一个实例不会分配新内存,但会创建新实例。时间jvm垃圾收集器会释放内存。你无法控制它。因此,除非您保留历史记录,否则更新现有实例总是更好。
但是你总是可以使用setter函数。
public class Point {
public int x;
public int y;
public Point(int ax, int ay){
this.setXY(ax, ay);
}
public void setXY(int ax, int ay){]
x = ax;
y = ay;
}
}
答案 3 :(得分:-1)
您可以使用一些实例变量,而不是在每次调用时构造对象。 这会影响您的性能,因为这样您每次都必须创建和初始化对象。
因此,更好地进行更新实例变量的方法调用。