4

N = 10^9 または非効率性に気付くのに十分な大きさの次の 2 つのループを考えてみましょう。

Loop x = 1 to N
    total += A(x)
    total += B(x)

また

Loop x = 1 to N
    total += A(x)

Loop x=1 to N
    total += B(x)

各関数は x を取り、任意の算術計算 (x^2 や 3x^3 など、問題ではありません) を実行し、値を返します。

全体的な実行時間に違いはありますか? また、そうでない場合はいつですか?

4

6 に答える 6

2

各ループには 4 つのアクションが必要です。

  1. 準備(ループごとに 1 回)
  2. 停止条件のチェック(反復ごとに1回)
  3. ループ本体の実行 (反復ごとに 1 回)
  4. 反復を続行するかどうかを決定するために使用される値の調整 (反復ごとに 1 回)

ループが 1 つある場合、アイテム 1、2、4 の「支払い」は 1 回だけです。ループが 2 つある場合は、すべてを正確に 2 回「支払う」ことになります。

2 つの関数を呼び出す順序は重要ではないと仮定すると、ほとんどの一般的な状況では違いは目立ちません。ただし、ループが非常にタイトな非常にまれな状況では、1 つのループで CPU リソースの使用量が少なくなります。実際、ループの巻き戻しの一般的な手法は、本体を数回繰り返し、対応する係数で反復回数を減らすことによって、ループ中の全体的な CPU 負荷における反復ごとのチェックとセットアップ操作の割合を減らすことに依存しています。

于 2013-03-03T20:08:57.843 に答える
2

考えるべきことがいくつかあります。x1 つは、2 番目のバージョンでは、ループ自体 (条件チェック、インクリメントなど)に対して 2 倍の命令を実行していることです。関数が本当に些細なものである場合、それは大きなコストになる可能性があります。

ただし、より現実的な状況では、キャッシュのパフォーマンス、レジスタの共有などによって、より大きな違いが生じるでしょう。たとえば、両方の関数が多くのレジスタを使用する必要がある場合、コンパイラはループごとに 1 回実行するため、より多くのレジスタをメモリに書き込む必要があるため、2 番目のバージョンは最初のバージョンよりもパフォーマンスが低下することがあります。または、ABの両方が同じメモリにアクセスする場合、Bのアクセスはすべて 2 番目のバージョンではキャッシュ ヒットになりますが、最初のバージョンではミスするため、2 番目のバージョンは 2 番目よりも高速になる可能性があります。

これらはすべて、プログラムおよびプラットフォームに大きく依存します。最適化したい特定のプログラムがある場合は、それをベンチマークする必要があります。

于 2013-03-03T20:11:39.657 に答える
1

主な違いは、最初のものは N に対して X を N 回テストするのに対し、2 番目のものは N に対して X を 2N 回テストすることです。

于 2013-03-03T20:06:15.773 に答える
0

考慮すべき潜在的な要因はたくさんあります。

1) 反復回数 -- ループのセットアップがタスクを支配するか 2) ループ比較のペナルティとタスクの複雑さ

for (i=0;i<2;i++) a[i]=b[i];

3) 関数の一般的な複雑さ - 2 つの複雑な関数を使用すると、レジスタが不足する可能性があります。

4) 依存関係を登録するか、本質的に連続したタスクである - 2 つの独立したタスクが混在している場合と、他のループの結果が最初のタスクに依存している場合

5) ループはプリフェッチ キューで完全に実行できますか -- キャッシュ アクセスは必要ありません。2 番目のタスクが混在するとスループットが低下する可能性があります。

6) どのようなキャッシュヒットパターンがあるか

于 2013-03-04T19:44:31.453 に答える
0

ループ自体にわずかなオーバーヘッドがあります。

各反復では、少なくとも 2 つの操作を実行し、カウンターを増やしてから、最終値と比較する必要があります。

したがって、さらに 2*10^9 回の操作を行うことになります。

于 2013-03-03T20:07:03.220 に答える
0

両方の関数が大量のメモリを使用した場合 (たとえば、大きな配列を作成し、反復ごとに再帰的に変更した場合)、メモリ キャッシュなどが原因で最初のループが遅くなる可能性があります。

于 2013-03-03T20:12:06.463 に答える