[解決済み] カウントダウンはカウントアップより早い?
質問
コンピュータサイエンスの先生が、カウントアップするよりもカウントダウンしたほうが効率がいいと言っていました。 たとえば、FOR ループを使用する必要があり、ループ インデックスがどこかで使用されていない場合 (N * の行を画面に印刷するような場合)。 こんな感じのコードってことです。
for (i = N; i >= 0; i--)
putchar('*');
はより良い。
for (i = 0; i < N; i++)
putchar('*');
それは本当にそうなのでしょうか?もしそうなら、その理由を知っている人はいますか?
どのように解決するのですか?
<ブロッククオート本当にそうなのでしょうか?もしそうなら、その理由を知っている人はいますか?
昔、まだコンピュータが石英から手で削り出されていた頃、8ビットマイクロコントローラが地球を歩き回っていた頃、そしてあなたの先生が若かった頃(あるいはあなたの先生の先生が若かった頃)、次のような共通の機械命令が存在しました。 デクリメントしてゼロならスキップする (DSZ) と呼ばれる一般的なマシン命令がありました。 やり手のアセンブリプログラマーは、この命令を使ってループを実装していました。 後のマシンはよりファンシーな命令を持つようになりましたが、それでも何かを比較するよりもゼロと比較する方が安いプロセッサはかなりありました。 (これは、PPC や SPARC のような、レジスタ全体が常にゼロであるように予約されている最新の RISC マシンでさえも当てはまります)。
ですから、もしあなたがループを装備して、ゼロと比較する代わりに
N
と比較すると、どうなるでしょうか?
- レジスタを保存することができます。
- より小さなバイナリ・エンコーディングで比較命令を取得することができます。
- 前の命令がたまたまフラグを設定した場合 (おそらく x86 ファミリ マシンでのみ)、明示的な比較命令が不要になる場合があります。
これらの相違は 測定可能な改善 について 実際のプログラム を最新のアウトオブオーダー プロセッサで実行できますか? その可能性は極めて低いでしょう。 実際、マイクロベンチマークで測定可能な改善を示すことができれば、私は感銘を受けるでしょう。
要約です。 先生の頭を叩いてやる! ループの組み方について、時代遅れの似非事実を学ぶべきではありません。 学ぶべきは ループについて最も重要なことは、ループが を終了させることである。 を生成することです。 正しい答え であり、かつ 読みやすい . 先生は神話ではなく、大事なことに目を向けてほしいです。
関連
-
[解決済み] ソケットアクセプト - "開かれているファイルが多すぎる"
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] B "の印刷が "#"の印刷より劇的に遅いのはなぜですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] JavaScriptでオブジェクトのキー/プロパティの数を効率的にカウントする方法
-
[解決済み] <は<=より速いのか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] \0-9]よりも効率が悪い
-
[解決済み] なぜ[]はlist()よりも速いのですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
#137: 式は変更可能なlvalueでなければならない問題 // 文字列配列の代入問題
-
[C] Error [Error] 代入の左オペランドとして lvalue が必要です。
-
C++の配列コピー
-
警告: 'struct XXX' はパラメータリストの内部で宣言されています。
-
[解決済み] C言語でchar配列をコピーする方法は?
-
[解決済み] C 言語で const char* を char* に変換するには?
-
[解決済み] なぜmemsetではなくbzeroを使用するのですか?
-
[解決済み] C言語の**はどういう意味ですか?
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]
-
[解決済み] フリーは、どのように無料化を知っているのですか?