2012-01-15 10 views
15

は例えば、私はそれがgccのために定義されたとして、Linuxカーネルで使用されている知っている:C#で分岐予測ヒントを使用することはできますか?

#define likely(x)  __builtin_expect((x),1) 
#define unlikely(x)  __builtin_expect((x),0) 

このようなものは、C#で可能でない場合は、ほとんどを入れて手動でif文の順序を変更するための最良の選択肢であり、最初に起こりそうなケース?この種の外部知識に基づいて最適化する方法は他にありますか?

関連する注意点として、CLRはガード句を特定する方法を理解しており、代替ブランチが使用されると仮定しているため、この最適化をガードクラスに使用するのは不適切です。

(私は、これはマイクロ最適化することも実現注;私は学術目的のためにのみ興味があります。)

+4

どのようにすれば、C#でILにコンパイルされたバイトコードがどのネイティブCPUにコンパイルされてしまうのでしょうか? – Oded

+0

答えは「いいえ、できません」です。この不可能性の根拠はOdedによって示されている。 –

+0

私はILがインラインでコンパイルされ、ヒントの指示が使用できるネイティブコードにコンパイルされているので、ILでそれを実行することが可能であることを期待していたと思います。または、プロセッサレベルでなくても、他の類似の手法を使用することもできます(ただし、これが可能かどうかはわかりません)。 – ceyko

答えて

23

短い答え:いいえ。

長い回答:あなたはない本当にほとんどの場合にする必要があります。 は、ステートメントのロジックを変更してヒントを表示します。誤って予測されたブランチカウンタをキャプチャすることができるため、Visual Studioの上位バージョン(および高価なバージョン)に組み込まれているようなパフォーマンスツールでは、これを行うのが簡単です。これは学術的な目的のためであることを認識していますが、JITerが非常にでコードが最適化されています。 (CLR via C#からほとんど丸写ししたもの)の例として

このコード:

public static void Main() { 
    Int32[] a = new Int32[5]; 
    for(Int32 index = 0; index < a.Length; index++) { 
     // Do something with a[index] 
    } 
} 

a.Lengthが財産であるため、非効率的であるように見えることがあり、我々はC#で知っているように、プロパティが実際のセットです2つの方法(この場合はget_Lengthset_Length)。しかし、JITはそれがプロパティであることを認識しており、長さをローカル変数に格納したり、メソッドをインライン化してオーバーヘッドを防ぎます。

...一部の開発者は、能力にJITコンパイラの を過小評価してきたし、JITコンパイラ を支援するための試みで「賢いコード」を書くことを試みました。しかし、あなたが思いついた巧妙な試みは、ほぼ確実に のパフォーマンスに負の影響を与え、コードを読みにくくしてメンテナンス性を低下させます。とりわけ

は、それが実際にはさらに進んで、ループの代わりに、パフォーマンスを低下させるループ、内部外に一度境界チェックを行います。

私はそれがあなたの質問に直接関係することはほとんどないことを認識していますが、私は、JITが一般的にそれは正確にこれのために設計されたので、より良い。 (x86 JITコンパイラは、x64コンパイラよりも積極的な最適化を実行します)

This articleは、.NET 3.5 SP1で追加された最適化のいくつかを説明しています。

コンパイラが生成するものとCLRのパフォーマンスに関する偉大な本を読んでみたいと思えば、私はCLR via C#を使って上で引用した本をお勧めします。

編集:これが現在.NETで可能な場合は、EMCA-335 standardまたはworking draftのいずれかの情報を見つけることができます。これをサポートする標準はなく、IlDasmやCFF Explorerなどのメタデータを見ると、ブランチの予測を暗示できる特別なメタデータの兆候は見られません。

+0

これは残念ですが、JITingに関する情報は安心しています。ヒントをありがとう、私は間違いなくCLRに精通していないので、その本をチェックアウトしますが、最近実際に何が起こっているのか非常に興味を持っています。 – ceyko

+0

私はその本の多くを楽しんでいたが、私はあなたが与える引用を嫌う。それは事実上正確ですが、私は「巧妙なコード」についての嫌いな点があります。特に、与えられた最適化がなぜ行われないのか疑問に思っている人もいます。可能な限り最も効率的なコードを常に生成する魔法のように完璧なジッタを想像してみましょう。また、何も最適化しなかった恐ろしい未知のものを簡単に想像してください。そのポイントが間にどこにあるのか分からず、人々はホットスポットでこれらのことを試して、彼らが働くかどうかを見極めます。 –

+0

@ジョンハンナ - 私は大部分あなたに同意すると思います。私は開発者がJITerが何をしているのか無視するべきではないと思います。私たちが実際に何が最適化されているのかを実際には分かっていないことは少し残念です。私はそれが完璧ではないことを知っている。私はそれがひどいのではないことも知っています。あなたはそれを簡潔に言っていますが、最適化の程度はわかりません。 (フレームワークの1つのバージョンのために)知る唯一の方法は、Windbgのようなものを使って、何が行われているのかを調べることです。しかし、それはやったよりも簡単です。 –

関連する問題