0

あなたのパフォーマンスポイントにとって、どちらのコードが優れていますか? for ループでの ref 作成がうまくいかないので、2 つ目のコードを考えます。

あなたの意見を聞かせてもらえますか?

// First Code
for (int i = 0; i < array.size(); i++) {
    SipSession abc = (SipSession) array1.get(i);
}

// Second Code
SipSession abc = null;
for (int i = 0; i < array.size(); i++) {
    abc = (SipSession) array1.get(i);
}
4

6 に答える 6

3

コードのプロファイリングを行い、これがボトルネックであることを確認した後で、パフォーマンスの理由からのみ選択する必要があります。

それが完了するまでは、より明確で維持しやすいと思われるバージョンを選択してください。

SipSessionループを存続させるために最後の参照が必要な場合を除いて、常に最初のバージョンを選択します。

于 2013-01-19T14:12:25.793 に答える
1

最終的には違いはありません。JIT は、そのコードをまったく同じものに最適化します。

もちろん、唯一の違いは範囲です。

于 2013-01-19T14:12:20.730 に答える
0

両者のパフォーマンスに大きな違いはないと思います。唯一の大きな違いは、SipSession参照の範囲です。ただし、それほど気にする場合は、プロファイリングを試してください。

于 2013-01-19T14:08:43.903 に答える
0

これはマイクロ最適化であり、ボトルネックであるという証拠なしにコードを最適化するよりも、他の種類のコードの最適化を行う方がよいでしょう。ここではそうではありません。

于 2013-01-19T14:14:35.040 に答える
0

プロファイリングなしで最適化を試みないでください。JITコンパイラは手間のかかる作業を行うので、する必要はありません

それはさておき、あなたは一般的なのではなくarray生のようです。ジェネリックスは必ずしもコードを最適化するわけではありませんが、理解と保守がはるかに簡単になります。単純なループは次のように書き直すことができます。ListList<SipSession>

List<SipSession> array;
for(SipSession abc : array){
    // Stuff    
}
于 2013-01-19T14:17:09.447 に答える
0

最初のコードでは、VM またはコンパイラでさえ参照変数を単に削除します。参照変数はそのスコープ内で使用されることはないからです。

に最適化されます。

for(int i=0;i<array.size();i++){
    array1.get(i);    
}

メソッドの実行内容によっては、get最適化中にホール ループが削除される場合があります。

要素がアクセスされる順序が重要でない場合は、次のこともできます。

for (int i = array.size()-1; 0 <= i ;) {
    SipSession abc = (SipSession) array1.get(i--);
}

これはarray.size()、各ループ反復ではなく、1 回だけ呼び出されます。

于 2013-01-19T14:12:16.620 に答える