10

あなたならどちらにしますか?

 doThings(folder.getInstructions()) ;
 for (Instruction instruction : folder.getInstructions()) {
    // do things
 }
functionCall(folder.getInstructions()) ;

またはこれ:

instructions = folder.getInstructions() ;
doThings(instructions)
for (Instruction instruction : instructions) {
  // do things
}
functionCall(instructions) ;

何よりも、値をローカル変数に格納する方が効率的な場合と、関数呼び出しを行う方がよい場合を知りたいです。

4

5 に答える 5

21

読みやすいほど効率的です。一時的な式とローカル変数には同じスペースが必要であり、CPU/JVM の観点からは大きな違いはありません。JVM は、それを最適化/インライン化するより良い仕事をします。

ただし、getInstructions()メソッド呼び出しが高価な場合は、ローカル変数にキャッシュします。単純なゲッターの場合は、とにかくインライン化されます。また、特定のケースのローカル変数の私見は、よりgetInstructions()読みやすく、時間の経過とともに異なる結果になる可能性がある場合は、さらに正確になる可能性があります。

于 2012-10-03T09:27:12.477 に答える
10

それは完全に何をするかに依存getInstructions()します。フィールドの値を返すだけで、呼び出し間でフィールド値が変わらないことが確実な場合は、2 つのスニペット間で効率の違いが見られない可能性があります。

一方、getInstructions()多数の Web リクエストを行う必要がある場合は、明らかにそれを何度も呼び出すことは避けたいと考えています。

ただし、読みやすさは効率よりも重要です。この場合、とにかく 2 番目のオプションの方が読みやすいと思います。同じ値で 3 つの別々の手順 (2 つのメソッド呼び出しと 1 つのループ) を実行する必要があることがより明確になります。一方、私は次のようなものを書くことができてとてもうれしいです:

for (int i = 0; i < text.length(); i++) {
    ...
}

それを別の変数に分割するのはなく、

int length;
for (int i = 0; i < length; i++) {
    ...
}

それは本当に文脈に依存します。読みやすさの観点から、追加の変数が役立つ場合とそうでない場合があります。効率の観点は、メソッド呼び出しが何を行っているか、およびそれが JIT に対して「インライン化可能」であるかどうかに完全に依存します。

于 2012-10-03T09:28:42.253 に答える
0

メソッドの結果を複数回使用する場合は、メソッド呼び出しの結果を一時変数に格納することをお勧めします。これにより、メソッド呼び出しの処理時間が節約されます。この場合、これはそれほど影響しません。ただし、呼び出しが多い場合は影響する可能性があります..

また、ローカル変数は に保存されることを覚えておいてくださいstack。したがって、一時的なローカル変数を持つことは、スタック上のスペースを占有しています。これは、このような小さなケースではあまり問題ではありませんが..しかし、不必要なローカル変数は避けるべきです..

したがって、両方の方法の長所短所があります..

于 2012-10-03T09:27:16.937 に答える
0

状況によると思います。同じメソッド呼び出しを何度も行う必要がある場合 (そして同じ値を取得している場合)、1 回呼び出してローカル変数に格納することをお勧めします。

関数を 1 回だけ呼び出す必要がある場合。ローカル変数に行く必要はありません。

于 2012-10-03T09:35:41.087 に答える
0

私の答えは、開発しようとしているアプリケーションの種類によって異なります。例えば、

アプリケーション中に値が急速に変化する場合は、最初のコード ブロックの方が適切です。これは、正確な結果が必要な場合に適しています。

最初にフェッチされた値がコードの他の部分に影響を与えないことが確実な場合は、2 番目の方法が適しています。

于 2012-10-03T09:32:23.177 に答える