2

私のタスクを完了している間、今日考えられている問題は、ループ効率についてです..

まあ言ってみれば。私は配列 {'a','x','a','a'} と'x' 要素を避けるべきループを持っています今、私はこれらの 2 つのアプローチが効率の点でどのように異なるのか疑問に思います - while または do を取らない-while または for ループの微分

char[] arrExample = {'a','x','a','a'};
for(int idx = 0; idx<arrExample.length; idx++){
    if(arrExample[idx] == 'x')
        continue;

    System.out.println(arrExample[idx]);
}

共通ループは次のようになります

char[] arrExample = {'a','x','a','a'};
for(int idx = 0; idx<arrExample.length; idx++){
    if(arrExample[idx] != 'x')
        System.out.println(arrExample[idx]);
}

そう.. 専門家のコメントをお待ちしております。ありがとう!

4

7 に答える 7

5

最適化されていないバイトコードを使用した場合でも、ほぼ同じになります。本当の違いは2つだけです。1つ目はジャンプステートメントの配置ですが、そのジャンプステートメントは同じ回数実行されます。また、==演算子と!=演算子はどちらもアトミック演算子であり、両方を実行するのに同じ時間がかかります。

前に述べたように、あなたにとって意味のあるものは何でも使用してください。しかし、私は認めなければならないでしょう、その継続ステートメントバージョンは読むのがかなり厄介です。

于 2010-10-08T05:21:51.277 に答える
3

あなたがそれを心配しているなら、あなたはあまりにも低いレベルを見ていると思います. オッズは、大きな違いはないということです。

コーディングに対する私の好みは、通常は continue を使用せず、代わりに != を使用することです。これは、より良いコードにつながる傾向があるためです...しかし、それは常に正しいとは限りません。

速度が問題であることが判明しない限り、速度よりもコードの明快さ/素早さを優先します。

于 2010-10-08T05:00:57.470 に答える
3

実際の入力でアプリケーションをプロファイリングし、この特定のループにかなりの時間がかかると判断した場合を除き、このレベルでコードを手動で最適化することについて心配する必要はありません。

  • この特定のループは、全体的なパフォーマンスにとって重要ではない可能性があります。
  • あなたが検討している変更が何の違いももたらさない可能性があります。
  • あったとしても、最も効率的なコードはハードウェア プラットフォームと JVM のバージョンに依存する可能性があります。(JIT コンパイラは常に改善されています。)

実際、Sun 関係者は、コードを複雑な方法で記述すると、JIT オプティマイザーがうまく機能しにくくなる可能性があると述べています。そのため、手作業による最適化によって、ある JVM バージョンではパフォーマンスが向上する可能性がありますが、同じ最適化によって、実際には別のバージョンではパフォーマンスが低下する可能性があります。

于 2010-10-08T05:16:46.293 に答える
3

最適化コンパイラは、両方に対して本質的に同一の命令を生成します。あなたにとってより意味のある方を使用してください。

于 2010-10-08T04:59:05.710 に答える
2

パフォーマンスに関しては、大きな違いは見られませんが、2番目のものは非常に読みやすいように見えます。

(ごくわずかな)パフォーマンスの違いがあったとしても、私は2番目に行きます。

于 2010-10-08T05:30:12.330 に答える
1

このループの効率を本当に気にかけているのであれば、私の考えでは 2 つの選択肢があります。

  • それを測定します(気になるプラットフォームで)
  • 生成されたバイトコードをチェックして、どちらがより効率的かを確認してください。

しかし、実際には、Amber が指摘したように、ある程度まともなコンパイラで同一のバイト コードを取得する必要があります。したがって、より明確に感じられるものを使用してください。私にとっては、特にifの体が少し大きいので、継続するとより明確になります。

于 2010-10-08T05:05:17.427 に答える
0

両方のループの複雑さは同じであり、どちらも大きな違いはありません。個人的には、マイクロ秒を節約するためだけにコードの可読性を犠牲にしたくありません。

上記の実装のいずれかを選択したとします。コンパイラが異なれば、最適化も異なり、「マイクロ秒の節約」がなくなる可能性があります。

コードの可読性の観点から、私は「continue」または「break」のないものを好みます。

于 2012-06-01T08:09:41.897 に答える