私は興味深いプログラムを書いています。関数呼び出しの数を減らすために追加の「if」ステートメントを作成するか、それらの「if」を回避してより多くの関数呼び出しを取得するか、何が良いのか疑問に思っています。この関数は、IEqualityComparer のメソッド Equals をオーバーライドする仮想メソッドであり、2 つのファイルのサイズとハッシュを比較するだけです。if ステートメントは、これら 2 つのファイルのサイズを比較します。私はあなたがこの論理の要点を得たと思います。ご覧のとおり、私はこのプログラムを C# で書いています。何を選ぶべきか迷っているのはこれが初めてではないので、誰でも答えられるかもしれません。ありがとう
9 に答える
調べるためにプロファイリングを試しましたか?これらのいずれかがアプリケーションのボトルネックであると確信していますか?
昔、CPU が「馬鹿げた」ものだった 486 年以前では、分岐ロジック (たとえば、if()
) によってパイプラインやキャッシュ フラッシュが発生し、速度が低下していました。最近では、最新のコンパイラと、順不同の分岐予測 CPU により、このようなオーバーヘッドは最小限に抑えられています。
あなたの質問に答える唯一の適切な方法は、両方の方法をベンチマークして、どちらが速いかを確認することです。
テスト中に観察した実際のパフォーマンスが原因なのか、それとも数サイクルを無駄にする可能性を考えているという事実が原因なのか? 2 番目のケースの場合、問題を解決する唯一の正気の方法は、態度に取り組むことです。
分岐のコストを予測するのは非常に困難です。最新のプロセッサは、非常に巧妙な技術を使用して実行を高速化するためです。それらは、分岐先を予測するために使用されるいくつかの特別なデータ構造を保存します。予測が正しければ分岐は非常に安く、そうでなければかなりコストがかかります。誤った予測の割合は低いですが、もちろんゼロではありません。あなたの質問に対して決定的な答えが得られるとは思えません
if
分岐によるコストが発生する可能性があります。コストは、if ケースで実行されるコード、else ケースで実行されるコード、CPU キャッシュのサイズ、およびコンパイラの決定によって異なります。
関数呼び出しには、関数呼び出しのコストが原因でコストがかかる場合があります。これは、 for よりもはるかに大きくなるif
か、ゼロになる可能性があります (呼び出しがインライン化されているため、コンパイラーがコンパイル時にどのフォームが呼び出されるかを「確認」できる場合、仮想呼び出しでもインライン化が発生する可能性があります)。間に。
このため、この質問に対する一般的な答えは実際にはありません。プロファイリングしても、アセンブリのバイナリ コピーを使用しても (ジッターが異なるため)、別のバージョンの .NET 環境を使用しても (そしてここで「異なるバージョン」には、それに関連するサービス パック、ホット フィックス、およびパッチが含まれます)。
私の推測では、if ステートメントの方が優れていると思いますが、今日の高度なコンパイラでは、実際にはわかりません。最善の策は、両方を試してパフォーマンスを比較することです。