1

私は最近、Michael Abrash のThe Zen of Assembly Language (1990 年から) を手に取り、分岐 (ジャンプ) が発生する場合など、命令のプリフェッチが常に有利であるとは限らないというセクションを読んでいました。これは、プリフェッチされたすべての命令が実行対象ではなくなったため、さらに命令をフェッチする必要があるためです。

これは、Andre LaMothe による別の古い本、 Tricks of the Game Programming Gurusの最適化を思い出させました。彼は、条件ステートメントを設定するときに、最も頻繁に (または期待される) パスを最初に置くことを提案しています。

例えば:

if (booleanThatIsMostLikelyToBeTrue)
{
   // ...expected code
   // also the code that would've been prefetched
}
else
{
   // ...exceptional or less likely code
}

私の質問は次のとおりです。

1) LaMothe の最適化は、これを念頭に置いて提案されましたか? (本はもう持っていません)

2) このタイプの最適化は、現代のマシンで今でも価値のあるプログラミングの習慣ですか? (多分、プリフェッチは以前とは異なる方法で処理されますか?)

4

2 に答える 2

1

コードの分岐をできるだけ少なくし、分岐した場合は後方に分岐するように設定する必要があります。その IF を行うためのより信頼できる方法は、常に一般的なことを行い、例外をテストすることです。

Aをしてください; if( テスト ) Do B;

もちろん、これは、B が発生した場合に A が行うことはすべて B によって逆転されるように調整する必要があります。

Zen プログラミングのポイントは、If ステートメントを完全に排除しようとすることです。たとえば、10 回ループする (終了条件テストが必要) 代わりに、同じステートメントを 10 回書くだけです。もう 1 つの例は、リストをループしている場合、インデックス値をテストする代わりに、センチネルを使用してループを終了することです。

C で作業している場合、コンパイラに意図したとおりの動作をさせるのは難しい場合があります。IF ステートメントの最初または 2 番目に何かを置いても、コンパイル結果には影響しません。適切なコンパイラ オプションを使用することが重要であることに注意してください。たとえば、Visual C++ で /O2 (速度の最適化) を使用すると、コンパイルの効率に大きな違いが生じます。

于 2012-10-31T18:21:15.763 に答える
1

この種の最適化は、多くの場合に役立ちます。ただし、通常は、プログラムを作成してプロファイリングし、これらのマイクロ最適化を実行することでプログラムが恩恵を受けると判断した後に行うことです。

また、多くの最新のコンパイラにはプロファイルに基づく最適化があり、パフォーマンスのためにコードをゆがめる必要がなくなります。

于 2012-10-30T21:52:12.123 に答える