9

私は自分のコードのいくつかを最適化しようとしてきましたが、iveはforsに関して奇妙な結論に達しました。

私のテストケースでは、iveはメインアクティビティを含む新しいプロジェクトを作成しました。このアクティビティは、500個のオブジェクトのリストを初期化し、明示的なGCを実行して、スレッドを開始します。スレッドは関数doCalculationsをループします。

this.objectsは500MyObjectのリストで、前はMyObject、値はintです。関数ロジックにはロジックがなく、何かをするためだけにあります。違いはの内側にあります。

function1

public void doCalculations()
{
    for(MyObject o : this.objects)
            for(int i=0; i<this.objects.size(); i++)
                if(this.objects.get(i) == o)
                    o.value = this.objects.get(i).value;
}

機能2

public void doCalculations()
{
    for(MyObject o : this.objects)
            for(MyObject o2 : this.objects)
                if(o2 == o)
                    o.value = o2.value;
}   

関数2を使用すると、GCは私のネクサスで約10秒ごとに呼び出され、約1.7MBを解放します。

機能1では、GCは表示されません。

何故ですか?

4

2 に答える 2

10

1つはイテレータを作成し、もう1つは作成しません。

GCは実際にアプリケーションのボトルネックですか?(可能性は低いようです。私を含め、多くの開発者は、読みやすさの利点が数マイクロ秒のGCを上回ると考えています。)

とは言うものの、ループ全体はとにかく何もしません。

于 2012-12-21T21:55:31.313 に答える
3

私の提案は、内側のforループが外側のforループの実行ごとにイテレーターを作成するためです(関数2)。このイテレータ-インスタンスは関数1では作成されません

于 2012-12-21T21:58:28.350 に答える