2

私はAndroidの最適化に関するGoogleのヒントを読んでいましたが、彼らが最初に提起するポイントの1つは、ガベージコレクションが増えることを意味するため、短期変数の使用を避けるべきであるということです。では、オブジェクトを使用するたびにアクセサーを呼び出すのではなく、変数を定義してそれを使用したほうがよいポイントはありますか?これ言ってみて:

for(int i = 0; i < 1000; i++) {
    foo.getBar() // then do something with it
}

これとは対照的に:

Bar bar = foo.getBar();
for(int i = 0; i < 1000; i++) {
    bar // then do something with it
}

パフォーマンス面での違いは何ですか?

4

3 に答える 3

3

あなたが提供したリンクから:「あなたはあなたがする必要のないオブジェクトインスタンスを作成することを避けるべきです」

  1. オブジェクトインスタンス!=短期変数
  2. 文の2番目の部分を忘れないでください...

ローカル変数は通常スタック(GCは無関係)に割り当てられますが、新しいオブジェクトインスタンスはヒープに割り当てられます。これはまったく別の話です。「本当に必要がなければ何もしない」というようなTMHOの価値はほとんどありません。さらに、可能な場合はローカル変数の作成を避けようとすると、コードに本当に悪い影響を与える可能性があります。これを読んでください

于 2013-03-25T04:18:12.817 に答える
2

コンパイラの最適化がないと仮定

使用する場合

for(int i = 0; i < 1000; i++) {
    foo.getBar() // then do something with it
}

コードは、によって参照されるインスタンスに移動し、fooそのメソッドを実行します。これにより、getBar()返されるはずのインスタンス/値が返されます。これは、そのループを1000回実行するたびに実行されます。各実行が実行された後、によって返される値はgetBar()ガベージコレクションされる必要があります。

ただし、使用する場合:

Bar bar = foo.getBar();
for(int i = 0; i < 1000; i++) {
    bar // then do something with it
}

ループの外側で一度だけ値を取得し、foo.getBar()そのコピーをローカルに保存します。このローカルコピーは、ループで1000回使用されます。

foo2番目のオプションは、インスタンスのgetBar()メソッドが1000回ではなく、1回だけ呼び出されるため、より効率的です。これは、メソッドでコードを1000回実行しないことを意味します。これはgetBar()、1回実行するよりも明らかに悪い結果です。

これらはすべて本当にマイクロ最適化です。あなたが本当に重い物を持ち上げているのでない限りgetBar()、これは目立った効果はありません。多くの場合、コンパイラの最適化により、これらの両方がまったく同じバイトコードに変換されるため、とにかく心配する必要はありません。

于 2013-03-25T03:57:10.977 に答える
1

この例では、barがgetBarによって返される単なるオブジェクトであり、作成されていないと仮定すると、GCに関する限り違いはありません。

ただし、メソッド呼び出しにも小さなオーバーヘッドがあり、2番目の例の方が効率的です。

ただし、getBarが呼び出しごとに新しいオブジェクトを作成する場合、2番目の例では1000個の新しいバーが作成され、GCされますが、最初の例は同じままです。

于 2013-03-25T03:59:50.430 に答える