首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java -实例化的权重

Java -实例化的权重
EN

Stack Overflow用户
提问于 2012-02-27 13:35:18
回答 4查看 1.6K关注 0票数 2

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

代码语言:javascript
运行
复制
public class Point {
  public int x;
  public int y;
  public Point(int ax, int ay){
    x = ax;
    y = ay;
  }
}

而且我需要非常频繁地计算距离-例如,在移动设备上的滚动事件期间,每秒可能会触发几次。

如果每次都使用新的Point(a,b)来保持代码的清晰度和透明性,那么性能影响是否足够显著,以至于我应该考虑缓存一些引用并更新成员变量(而不是实例化)?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-27 13:47:37

更新以前的实例不会分配新的内存,但创建新的实例将。jvm垃圾收集器会时不时地释放内存。你无法控制这一点。因此,更新现有实例总是更好的,除非您要保留历史记录。

但是,您始终可以使用setter函数。

代码语言:javascript
运行
复制
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;
  }
}
票数 0
EN

Stack Overflow用户

发布于 2012-02-27 13:49:35

就我个人而言,我不会担心每次需要点时都实例化这些对象。虽然是的,缓存一些会稍微快一点,但我同意这会使代码不那么干净。查看这本关于对象创建成本的Java性能优化书籍:https://www.safaribooksonline.com/library/view/java-performance-tuning/0596000154/ch04.html

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

票数 5
EN

Stack Overflow用户

发布于 2012-02-27 15:16:24

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

http://www.ibm.com/developerworks/java/library/j-jtp01274/index.html

应该考虑可能的JVM优化,例如下面引述的那些。

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

但是,我对当今移动设备中使用的JVM实现并不特别熟悉,它们很可能无法与常规计算机上使用的实现相提并论。

在任何一种情况下,如果可能的话,通常都不鼓励执行过早的优化,除非有明显的和需要的与之相关的性能提升。

总而言之,除非你测量出Point对象的分配成本占用了太多的时间,否则你不应该牺牲代码质量来进一步提高它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9460480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档