4

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の減少につながる可能性があるかについてであることに注意してください。速度の違いを測定することはできますが、DalvikVMとAndroidGCについて十分に理解していないため、ゴミが少なくなる原因を予測できません。

4

1 に答える 1

7

このイディオムにより、double が null になり、パスごとに再割り当てされると想定していますが、追加のガベージは発生しないため、発生している GC の量が減少します。それとも、VM はそれよりもスマートですか?

プリミティブなローカル変数は、ヒープではなくスタック上に存在するため、GC する必要はまったくありません。関数が戻るとすぐに、それらは事実上なくなります-スタックフレームがクリアされるためです。

そうは言っても、ダブルスパスごとに再割り当てされます。これは、作成したコードがそうするように指示しているためです。この特定のメソッドの速度を上げたい場合は、が設定されているときにと を計算longRadslatRadslongitudelatitudeます。これを行う正しい方法は、これらのフィールドの設定を常にセッター メソッドに委譲することです。例えば:

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

もちろん、これにより設定が遅くなりますが、それは最適化についてあなたが求めたものではありません.

于 2013-02-02T20:52:04.033 に答える