使用局部变量与场对GC的影响

Sim*_*mon 4 java android dalvik

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

private void getVisiblePointsFromPath(){

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

   ...

}
Run Code Online (Sandbox Code Playgroud)

当方法退出并且双精度超出范围时,我认为它们符合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);

       ...

    }

}
Run Code Online (Sandbox Code Playgroud)

我假设这个习惯用法会导致双打被取消,然后在每次传递时重新分配,但不会导致额外的垃圾,从而减少我造成的GC数量.或者VM比那更聪明?

请注意,我的问题本身并不是"哪个更快",而是关于哪个可能导致GC减少.我可以测量速度差异,但我不太了解Dalvik VM和Android GC来预测哪个导致更少的垃圾.

Mat*_*all 7

我假设这个习惯用法会导致双打被取消,然后在每次传递时重新分配,但不会导致额外的垃圾,从而减少我造成的GC数量.或者VM比那更聪明?

原始局部变量存在于堆栈中,而不是堆,因此它们根本不需要GC.一旦函数返回,它们就会有效消失 - 因为它会清除堆栈帧.

也就是说,是的,双打在每次传球时重新分配,因为这就是你写的代码所说的.如果你想提高这个特定方法的速度,计算longRadslatRadslongitudelatitude设置.正确的方法是始终将这些字段设置为setter方法.例如:

public void setLongitude(double longitude) {
    this.longitude = longitude;
    this.longRags = longitude * (Math.PI / 180);
}
Run Code Online (Sandbox Code Playgroud)

当然,这将使设置更慢的操作,但这不是您要求的优化.