「IF」は高価ですか?質問する

「IF」は高価ですか?質問する

あの日、先生が何を言ったのか、どうしても思い出せないのですが、あなたはおそらく知っていると思います。

モジュールは「データ構造とアルゴリズム」で、彼は次のようなことを話しました。

このifステートメントは最も高価な [something] です。[something] は [something] を登録します。

はい、記憶力がひどくて本当に申し訳ないのですが、何時間もグーグルで検索しても何も出てきません。何かアイデアはありますか?

ベストアンサー1

ハードウェアの最も低いレベルでは、そうです。もしは高価です。その理由を理解するには、どのようにパイプライン仕事。

現在実行されている命令は、通常「命令ポインタ(IP)またはプログラムカウンター(PC) これらの用語は同義ですが、アーキテクチャによって異なる用語が使用されます。ほとんどの命令では、次の命令の PC は、現在の PC に現在の命令の長さを加えた値です。ほとんどの RISC アーキテクチャでは、命令はすべて一定の長さであるため、PC は一定量ずつ増加します。x86 などの CISC アーキテクチャでは、命令は可変長になる可能性があるため、命令をデコードするロジックは、次の命令の位置を見つけるために現在の命令の長さを計算する必要があります。

のために支店ただし、次に実行される命令は、現在の命令の次の場所ではありません。分岐は goto であり、プロセッサに次の命令がどこにあるかを伝えます。分岐は条件付きまたは無条件のいずれかであり、ターゲットの場所は固定または計算のいずれかになります。

条件付きと無条件の違いは簡単に理解できます。条件付き分岐は、特定の条件が満たされている場合にのみ実行されます (ある数値が別の数値と等しい場合など)。分岐が実行されない場合、制御は通常どおり分岐後の次の命令に進みます。無条件分岐の場合、分岐は常に実行されます。条件付き分岐は、ステートメントとループの制御テストで使用されます。if無条件分岐は、無限ループ、関数呼び出し、関数戻り、ステートメント、悪名高いステートメントなど、さまざまな場所で使用されます(これらのリストは網羅的ではありません)。forwhilebreakcontinuegoto

分岐ターゲットも重要な問題です。ほとんどの分岐には固定の分岐ターゲットがあり、コンパイル時に固定されたコード内の特定の場所に移動します。これには、ifステートメント、あらゆる種類のループ、通常の関数呼び出しなどが含まれます。計算されたブランチは実行時にブランチのターゲットを計算します。これには、switchステートメント (場合によっては)、関数からの戻り、仮想関数呼び出し、および関数ポインター呼び出しが含まれます。

では、これはパフォーマンスにとって何を意味するのでしょうか。プロセッサは、パイプラインに分岐命令が現れると、パイプラインをどのように満たし続けるかを考える必要があります。プログラムストリームの分岐後にどの命令が来るかを判断するには、2つのことを知る必要があります。(1) 分岐が行われるかどうか、(2) 分岐のターゲットです。これを判断することを「分岐」と呼びます。分岐予測、これは難しい問題です。プロセッサが正しく推測した場合、プログラムはフルスピードで続行されます。代わりにプロセッサが推測した場合誤って間違った計算に時間を費やしただけです。パイプラインをフラッシュし、正しい実行パスからの命令で再ロードする必要があります。要するに、パフォーマンスに大きな影響が出ます。

したがって、if文が高価である理由は、分岐予測ミスこれは最低レベルの場合のみです。高レベルのコードを作成する場合、これらの詳細についてはまったく気にする必要はありません。C またはアセンブリでパフォーマンスが極めて重要なコードを作成する場合にのみ、この点を気にする必要があります。その場合、分岐のないコードを記述する方が、さらにいくつかの命令が必要な場合でも、分岐するコードよりも優れていることがよくあります。、、などを分岐せずに計算するために実行できる、ビットを操作するクールなトリックがいくつかabs()ありmin()ますmax()

おすすめ記事