1. ホーム
  2. c

[解決済み] カウントダウンはカウントアップより早い?

2022-06-14 19:05:31

質問

コンピュータサイエンスの先生が、カウントアップするよりもカウントダウンしたほうが効率がいいと言っていました。 たとえば、FOR ループを使用する必要があり、ループ インデックスがどこかで使用されていない場合 (N * の行を画面に印刷するような場合)。 こんな感じのコードってことです。

for (i = N; i >= 0; i--)  
  putchar('*');  

はより良い。

for (i = 0; i < N; i++)  
  putchar('*');  

それは本当にそうなのでしょうか?もしそうなら、その理由を知っている人はいますか?

どのように解決するのですか?

<ブロッククオート

本当にそうなのでしょうか?もしそうなら、その理由を知っている人はいますか?

昔、まだコンピュータが石英から手で削り出されていた頃、8ビットマイクロコントローラが地球を歩き回っていた頃、そしてあなたの先生が若かった頃(あるいはあなたの先生の先生が若かった頃)、次のような共通の機械命令が存在しました。 デクリメントしてゼロならスキップする (DSZ) と呼ばれる一般的なマシン命令がありました。 やり手のアセンブリプログラマーは、この命令を使ってループを実装していました。 後のマシンはよりファンシーな命令を持つようになりましたが、それでも何かを比較するよりもゼロと比較する方が安いプロセッサはかなりありました。 (これは、PPC や SPARC のような、レジスタ全体が常にゼロであるように予約されている最新の RISC マシンでさえも当てはまります)。

ですから、もしあなたがループを装備して、ゼロと比較する代わりに N と比較すると、どうなるでしょうか?

  • レジスタを保存することができます。
  • より小さなバイナリ・エンコーディングで比較命令を取得することができます。
  • 前の命令がたまたまフラグを設定した場合 (おそらく x86 ファミリ マシンでのみ)、明示的な比較命令が不要になる場合があります。

これらの相違は 測定可能な改善 について 実際のプログラム を最新のアウトオブオーダー プロセッサで実行できますか? その可能性は極めて低いでしょう。 実際、マイクロベンチマークで測定可能な改善を示すことができれば、私は感銘を受けるでしょう。

要約です。 先生の頭を叩いてやる! ループの組み方について、時代遅れの似非事実を学ぶべきではありません。 学ぶべきは ループについて最も重要なことは、ループが を終了させることである。 を生成することです。 正しい答え であり、かつ 読みやすい . 先生は神話ではなく、大事なことに目を向けてほしいです。