5

これらの2つのコードスニペットの間に、メモリ使用量とパフォーマンス/オーバーヘッドの点で違いはありますか?

final float xPos = (CAMERA_WIDTH / 2) - (mSprite.getWidth() / 2);
final float yPos = (CAMERA_HEIGHT / 2) - (mSprite.getHeight() / 2);
mSprite.setPosition(xPos, yPos);

およびその他の場合:

mSprite.setPosition(((CAMERA_WIDTH / 2) - (mSprite.getWidth() / 2)), ((CAMERA_HEIGHT / 2) - (mSprite.getHeight() / 2)));

私が見ることができる唯一の違いは、最初のスニペットが2番目のスニペットとは異なるメモリ領域であると想定する場所に変数を格納していることですが、Javaのメモリ割り当てについてはあまり詳しくありません(私はCの方が好きです) / C ++人)。

私の質問は次のとおりです。いずれかの方法で何かメリットはありますか?final最初の例でキーワードを使用すると、まったく影響しますか?

ありがとうございました!

4

3 に答える 3

7

最初の例でfinalキーワードを使用すると、まったく影響しますか?

メモリに関してはありません。ただしfinal、オブジェクトを処理している場合は、実行中の参照が他のオブジェクトを指すことができないことをfinal保証します(プリミティブ型の場合、その変数の値が実行中に変更されないことを保証します)

メモリ使用量とパフォーマンス/オーバーヘッドの点で、これら2つのコードスニペットに違いはありますか?

もちろん、私が推測している経験に基づいて、変数を作成して維持する必要があるため、最初のアプローチではオーバーヘッドが発生します(どちらの場合もメモリ使用量はほぼ同じです)。現在のコンピューティングインフラストラクチャでは、いくらかのオーバーヘッドがありますが、それはごくわずかです。

ただし、最初のアプローチは、2番目のアプローチと比較して読みやすく保守しやすくなっています。マイクロ最適化をJVMに任せましょう

于 2012-10-25T03:47:18.413 に答える
3

メモリ使用量とパフォーマンス/オーバーヘッドの点で、これら2つのコードスニペットに違いはありますか?

2番目の質問に答えようとします。しかし、修正されることになります。

ケース1の場合、実行中の関数の実行中に2つの変数がスタックに作成されます。

オブジェクトmSpriteのメモリは、ヒープメモリに作成されます。また、オプション(1)と(2)で、このオブジェクトに割り当てられるメモリの量に違いはありません。

したがって、(1)と(2)の唯一の違いは、(1)がスタック上により多くのメモリを作成することです。そして、これは、この関数を実行しているメソッドが終了するとすぐに取得されます。

于 2012-10-25T03:59:21.900 に答える
1

これらはまったく同じだと思います。どちらの場合も、とにかく中間結果を格納するためにスタックが必要になります。率直に言って、JITは変数をインライン化し、とにかくこれら2つを完全に同等にする可能性があります。

于 2012-10-25T05:36:07.753 に答える