假设我有一个非常轻量级的对象:
public class Point {
  public int x;
  public int y;
  public Point(int ax, int ay){
    x = ax;
    y = ay;
  }
}而且我需要非常频繁地计算距离-例如,在移动设备上的滚动事件期间,每秒可能会触发几次。
如果每次都使用新的Point(a,b)来保持代码的清晰度和透明性,那么性能影响是否足够显著,以至于我应该考虑缓存一些引用并更新成员变量(而不是实例化)?
发布于 2012-02-27 13:47:37
更新以前的实例不会分配新的内存,但创建新的实例将。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;
  }
}发布于 2012-02-27 13:49:35
就我个人而言,我不会担心每次需要点时都实例化这些对象。虽然是的,缓存一些会稍微快一点,但我同意这会使代码不那么干净。查看这本关于对象创建成本的Java性能优化书籍:https://www.safaribooksonline.com/library/view/java-performance-tuning/0596000154/ch04.html
基本上,如果一台旧的奔腾II可以每秒创建一百万个轻量级对象,那么考虑到今天更快的处理器/内存/等等,我认为你没有什么可担心的。
发布于 2012-02-27 15:16:24
您可能还希望阅读以下参考资料,其中总结了现代JVM中分配的性能成本以及使用对象池的影响,对象池与您正在考虑的对象重用方案有许多相似之处。
http://www.ibm.com/developerworks/java/library/j-jtp01274/index.html
应该考虑可能的JVM优化,例如下面引述的那些。
JIT编译器可以执行额外的优化,从而将对象分配的成本降低到零。
但是,我对当今移动设备中使用的JVM实现并不特别熟悉,它们很可能无法与常规计算机上使用的实现相提并论。
在任何一种情况下,如果可能的话,通常都不鼓励执行过早的优化,除非有明显的和需要的与之相关的性能提升。
总而言之,除非你测量出Point对象的分配成本占用了太多的时间,否则你不应该牺牲代码质量来进一步提高它。
https://stackoverflow.com/questions/9460480
复制相似问题