gpt4 book ai didi

java - 使用局部变量与字段对 GC 的影响

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:30:42 24 4
gpt4 key购买 nike

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

private void getVisiblePointsFromPath(){

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

...

}

当方法退出并且 double 超出范围时,我假设它们符合 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);

...

}

}

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

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

最佳答案

I assume that this idiom will cause the doubles to be nulled then reassigned on each pass but will not result in additional garbage and thus reduce the amount of GC I'm causing. Or is the VM smarter than that?

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

就是说,是的, double 在每次通过时重新分配,因为这就是您编写的代码所说要做的。如果您想提高此特定方法的速度,请在 longitudelatitude 时计算 longRadslatRads > 已设置好。正确的做法是始终将这些字段的设置委托(delegate)给 setter 方法。例如:

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

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

关于java - 使用局部变量与字段对 GC 的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14666396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com