【问题标题】:Effect on GC of using local variables versus fields使用局部变量与字段对 GC 的影响
【发布时间】:2013-02-02 20:50:32
【问题描述】:

我在 onDraw() 方法的调用堆栈中有一个方法 3 级。每次重绘被称为数百次,有时甚至数千次。我已经对 onDraw() 方法进行了广泛的分析,我可以看到以下方法占总数的 14%,因此绝对值得一看。我需要在捏缩放和拖动操作期间提高帧速率。

private void getVisiblePointsFromPath(){

   double longRads = longitude * (Math.PI / 180);
   double latRads = latitude * (Math.PI / 180);

   ...

}

当方法退出并且双打超出范围时,我认为它们有资格进行 GC,尽管我知道这可能发生的时间是不确定的。

这样做有什么好处:

public class GisView extends ImageView{

    private double longRads;
    private double latRads;

    private void getVisiblePointsFromPath(){

       longRads = longitude * (Math.PI / 180);
       latRads = latitude * (Math.PI / 180);

       ...

    }

}

我假设这个习惯用法会导致双打被清空,然后在每次传递时重新分配,但不会导致额外的垃圾,从而减少我造成的 GC 数量。还是虚拟机比这更智能?

请注意,我的问题本身并不是“哪个更快”,而是关于哪个可能导致更少的 GC。我可以测量速度差异,但我对 Dalvik VM 和 Android GC 的了解还不够,无法预测哪个会导致更少的垃圾。

【问题讨论】:

  • 您应该考虑只计算一次Math.PI / 180 并将其存储在一个常量中。
  • @MrSmith42 嗯。我假设编译器会处理这个问题。当然,由于 Math.PI 和 180 是常量,编译器会使用 = latitude * 0.0174532925
  • 我认为它可能会被优化,但为什么希望编译器,当你可以用最少的努力自己做的时候。在分析字节码或测量性能差异之前,我会自己优化一下。
  • @MrSmith42 我已经进行了一些挖掘,据我所知,javac 编译器执行数字常量折叠。你能证明别的吗?我很确定它确实如此,因为int x = 1/0 会生成运行时错误,而不是编译错误,表明编译器已跳过折叠。还是我失去了情节?
  • @MrSmith42 我们的 cmets 交叉了 :) - 你是对的,无论如何我都会这样做并发表评论。谢谢。

标签: java android dalvik


【解决方案1】:

我假设这个习惯用法会导致双打被清空,然后在每次传递时重新分配,但不会导致额外的垃圾,从而减少我造成的 GC 数量。还是虚拟机比这更智能?

Primitive local variables live on the stack,而不是堆,所以它们根本不需要被 GC。一旦函数返回,它们就会有效地消失 - 因为这会清除堆栈帧。

也就是说,是的,双打 将在每次传递时重新分配,因为这就是您编写的代码所要求的。如果您想提高此特定方法的速度,在设置longitudelatitude 时计算longRadslatRads。正确的做法是总是将这些字段的设置委托给 setter 方法。例如:

public void setLongitude(double longitude) {
    this.longitude = longitude;
    this.longRags = longitude * (Math.PI / 180);
}

当然,这会使设置操作变慢,但这不是您要求优化的内容。

【讨论】:

  • 哇。我花了很长时间构思这个问题,答案很简单。这次真是万分感谢。了解非常有用。
  • 同意在 setter 中执行此操作,如果时间允许,我可以执行此操作(这是一个端口),但仅当 lat 和 long 更改时才会调用此方法,因此我不会减少计算.为了清楚起见,我没有显示 lat long 是该方法的参数。
猜你喜欢
  • 2019-07-23
  • 1970-01-01
  • 2012-11-05
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多