0

count変数の値は0または1または2のみになります

以下は私が達成しようとしていることです。カウントが1の場合、1回実行し、2回の実行で2回実行します。

これはより良い解決策ですか

        for(int j=0;j<count;j++){
            System.out.println("PRINTING...");
        }

またはこれ

        if(count==1){
            System.out.println("PRINTING...");
        }else if (count==2){
            System.out.println("PRINTING...");
            System.out.println("PRINTING...");
        }

どちらが良いのか、そしてその理由を知りたかったのです。

4

3 に答える 3

4

明らかに最初。繰り返さないでください!このループ展開は、時期尚早の最適化の深刻なケースのようです。

于 2013-03-07T15:37:31.683 に答える
1

実際の要件によって異なります。

「何をすべきか」が各反復で常に同じである場合、明らかにループの方が優れています。

そうでない場合は、差異の性質、差異の数によって異なります(たとえば、単一の特殊なケース、複数の特殊なケース、特殊なケースを計算できるかどうかなど)。

また、コードを変更せずにどれだけ拡張できるかが重要です。

于 2013-03-07T15:37:50.487 に答える
1

コードの可読性と保守性の観点からは、for ループ バージョンが明らかに圧倒的な差で勝っているため、問題はパフォーマンスだと思います。

ループ本体のコードが println 呼び出しと同じくらい長くかかる場合でも、問題はありません。

ループ本体が非常に小さく高速である場合、主なコストは、誤って予測された条件付き分岐またはキャッシュ ミスになります。条件付き分岐をパイプラインにロードした後、ハードウェアが次の命令について間違った推測をした場合、分岐が実行ステージに到達した後、パイプライン全体をフラッシュする必要があります。それは本当に費用がかかります。

if バージョンは、for ループほど一般的ではない条件分岐パターンになる可能性があります。ハードウェア分岐予測は、設計時に使用されたベンチマークによく登場する一般的なイディオムでうまく機能する可能性があります。

キャッシュ ミスは、プロセッサが実行ロジックにデータを取得する間にストールを引き起こす可能性があります。if バージョンは、ループ本体のコピーが 3 つあるために長くなるため、命令キャッシュ ミスのリスクが高くなります。これらは同じデータを使用するため、データ キャッシュ ミスが発生する可能性は同じです。

私の推測では、測定可能な違いがある場合、for ループ バージョンの方が高速である可能性が高いと思われます。これは単なる推測です。

プログラムのパフォーマンスがこのループの書き方に大きく依存する場合は、ベンチマークを実行する必要があります。ハードウェア分岐予測の微妙な点に依存しているため、できるだけ多くの異なるプロセッサの各バージョンでプログラムのベンチマークを実行することをお勧めします。これがプログラムのパフォーマンスにとってそれほど重要ではない場合は、for ループを使用してください。

于 2013-03-07T16:12:35.877 に答える