5

これら 3 つの情報源の間に、効率の点で違いはありますか?

for (int i=0; i<N; i++)
    int j = whatever();

int j;
for (int i=0; i<N; i++)
    j = whatever();

int i, j;
for (i=0; i<N; i++)
    j = whatever();

ありがとう。

PS:明らかに、私の質問は変数のスコープではなく、ループの効率についてのみ言及されています。特に、変数 j が 1 対 N 回宣言されている最初の 2 つのケースではそうです。

4

9 に答える 9

8

コードがコンパイラによって最適化されると、違いはなくなります。

デフォルトで最適化がオフになっているデバッグ モードで実行している場合、ループ スコープ内で変数を宣言すると、ループ スコープ外で変数を宣言するよりも効率が低下します。

この場合、ループの反復ごとに、コードはスタックに変数用のスペースを作成し、反復後に破棄されます。これは少し非効率的です。

ただし、 for ループ変数 (i) については、 for ループの前または内部で宣言する場所は問題ではありません。これは、スタックに一度だけ割り当てられるためです。

したがって、デバッグ モードで結論を出すと、2 と 3 の両方が 1 よりも優れたパフォーマンスを発揮します。リリース モードでは、3 つすべてが同じになります。

于 2013-07-18T16:25:56.703 に答える
4

変数の宣言は、実行時間ではなくコンパイル時間に影響します。スタック上でローカル変数が占有するスペースはコンパイル時に割り当てられるため、実行時は影響を受けません。

影響を受けるのは可読性です。一般に、変数を使用する場所の近くで変数を宣言し、プログラムが許す範囲内でそれらを保持するのが最善です。この意味で、最初のコード スニペットが最適です。

スニペット 2 または 3 を使用する唯一の理由は、変数の値が必要な場合、iまたはループが終了したj breakで、ステートメントがいつ実行されたかを調べる場合などです。これが事実であるかどうかをあなたの例から判断することはできません。

于 2013-07-18T16:17:38.270 に答える
1

それらは実際にはすべて同じものです。それらの唯一の違いは、2 番目の例では 1 つの変数がループの外側にスコープされ、2 番目の例では両方の変数がループの外側にスコープされることです。最初の例では、どちらの変数もループの外ではアクセスできないため、ループの外で変数にアクセスできる理由がない限り、ループ内の変数を処理するより良い方法になります。

int x = 0;

に関連付けられたメモリ内の場所に生の 32 ビット値 0 を割り当てることを JVM に要求するだけxです。Integer x = 0ただし、 JVM がより多くのリソース要件を持つ新しいオブジェクトをインスタンス化する必要があるため、このような状況でオートボクシングを使用すると楽しいものになります。

于 2013-07-18T16:20:05.750 に答える
0

書いてある通り?いいえ。

区別が重要な場合はありますか?はい。

とにかくコンパイラがそれを処理しないというケースが頻繁に発生しますか? いいえ。

どちらの場合でも、テストすることが最善の方法です。「なぜこれはそれよりも遅いのですか?」と答える (そして助ける) 方がはるかに簡単です。

于 2013-07-18T16:17:55.840 に答える
0

効率に関しては、3 つの例に違いはありません。ただし、コーディング標準に従って、必要な場合にのみ変数を宣言する必要があります。また、変数の可視性にも違いがあります。説明させてください

オプション1

 for (int i=0; i<N; i++)
int j = whatever();

ここで、変数 j のスコープは for ループ内のみです

オプション 2

int j;
for (int i=0; i<N; i++)
    j = whatever();

ここで、j は for ループの内側と外側に表示されますが、i は for ループのスコープ内でのみ表示されます

オプション 3

int i, j;
for (i=0; i<N; i++)
    j = whatever();

ここで、変数 i と j は両方の場所、つまり for ループの外側と内側に表示されます

于 2013-07-18T16:18:57.647 に答える
0

最初の例では、変数は初期化N時間になります。

基本的に、3 つの例に大きな違いはありません。jより広い範囲で変数が必要かどうかによって異なります。これが主な違いになります。

于 2013-07-18T16:17:12.070 に答える