Java—实例化的权重

Java—实例化的权重,java,performance,Java,Performance,假设我有一个非常轻的对象: public class Point { public int x; public int y; public Point(int ax, int ay){ x = ax; y = ay; } } 我需要经常计算距离——例如,在移动设备上的滚动事件中,每秒可能触发几次 如果代码每次使用新的点(A,B)都保持代码的干净性和透明性,那么性能命中率是否足够大,我应该考虑缓存一些引用并更新成员变量(与实例化相反)?p> 您可以在每次调用时使用

假设我有一个非常轻的对象:

public class Point {
  public int x;
  public int y;
  public Point(int ax, int ay){
    x = ax;
    y = ay;
  }
}
我需要经常计算距离——例如,在移动设备上的滚动事件中,每秒可能触发几次


如果代码每次使用新的点(A,B)都保持代码的干净性和透明性,那么性能命中率是否足够大,我应该考虑缓存一些引用并更新成员变量(与实例化相反)?p> 您可以在每次调用时使用一些实例变量,而不是构造对象。 这会影响性能,因为这样每次都必须创建和初始化对象


因此,最好有一个更新实例变量的方法调用。

更新以前的实例不会分配新内存,但创建新实例将。定时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;
  }
}

就我个人而言,我不会担心每次需要一个点时实例化这些对象。是的,缓存一些会稍微快一点,但我同意这会使代码变得不那么干净。查看这本Java性能优化书中关于对象创建成本的内容:


基本上,如果旧的奔腾II每秒可以创建一百万个轻量级对象,那么,考虑到今天更快的处理器/内存等,我认为您不必担心任何问题。

您可能还希望阅读以下资源,其中总结了现代JVM中分配的性能成本,以及使用对象池的影响,对象池与您正在使用的对象重用方案有许多相似之处考虑到

应该考虑可能的JVM优化,如下面引用的优化

JIT编译器可以执行额外的优化,从而将对象分配成本降至零

不过,我并不特别熟悉当今移动设备中使用的JVM实现方式,它们很可能与常规计算机上使用的实现方式不太一致。p> 在这两种情况下,如果可能的话,通常不鼓励执行过早的优化,除非有明显的和需要的性能提升


总而言之,除非您衡量点对象的分配成本占用了太多时间,否则您不应该牺牲代码质量来进一步改进它

+1因为我想我同意你的观点,但我认为我应该接受希普鲁的回答,因为第一句话确实总结了它。是的,希普鲁很好地总结了它。但不要低估可读性。鉴于这种情况下的性能差异可以忽略不计,我倾向于使用更简单、可读性更强的解决方案。(别担心,这不是懒惰!)是的,这是一个困难的平衡。在这种情况下,一个快速的手势可能会很快连续地检查尺寸和位置,而在一个没有大规模处理器保证的手持设备上,我只考虑了两个方面的性能,但一般来说,我更喜欢“漂亮”的代码,而不是从每一行中挤出最后一滴能量。谢谢你的回答。说得好,我没有把重点放在这个问题的移动方面。在资源有限的地方,任何简单的优化都不会有什么坏处!谢谢我已经知道这一点,但在简短、简洁的回答中看到粗体字让我意识到,我只是想让对象可变(通过提供setter)并不总是更好,事实上,使用不可变对象有很多好处,这可能会大大超过对象创建成本。请参见此处了解一些注意事项: