2015-01-08 4 views
5

スタック交換チームによって最も多くのオープンソースプロジェクトを見た後。私は、数回は、IL関数のコードをC#関数にインライン展開して書くことに気付きました。より高い言語でILを使用する場合

あなたがdapper fileで見ることができる完璧な例。

私の推測では、コンパイラは、最も効率的であると感じられるのコードを生成しない、時にはあなただけのコンパイラのためにそれを行う必要があるということです。

通常の古いC#よりもILエミッタの使用をいつ開始するのが好きですか?

私は例がstackexchangeのためのものですが、私は他の開発者がSigilが存在するとして見てこの決断をしなければならなかったgussingてる知っています。

+0

実際に行くとき、本当に悪いです。うまくいけば、決してそこに着くことはできません – BradleyDotNET

+0

そうです。私はその決定につながるベンチマークを見たいと思っています。 – dbarnes

+8

Dapperは、実行時まで知らないタイプのコードを動的に生成する必要があるため、ILを使用します。他の状況ではILを使用すべきではありません。 –

答えて

9

.NET ILは、ほとんどすべてを行うための唯一の方法があることを、実際のCPUアセンブリ言語(x86の、など)に比べて非常にシンプルです。つまり、良いILはないので、より良いILでパフォーマンスを向上させることはできません。 (あなたはデバッグビルドを行い、意図的に次善のILを生成しないと仮定しましょう。)

.NETのパフォーマンスは、JIT-TERのより多く依存します。とにかく、高水準の言語、JIT-ting、GC-ingなどの全体的なアイデア。パフォーマンスの料金があるので、ILのわずかな最適化はそれほど重要ではありません。

なぜILを使用しているのですか?コードを生成するときです(XSLT、正規表現、または動的プロキシをコンパイルするときなど)。文字列バッファにC#コードを作成してコンパイルするよりも、ILで行うほうがはるかに高速です。それだけです。 ILが必須であるとき

別にその場でコードを生成する機能から、私はILは、他の利点を持っているとは思いません。 C#はそのような機能豊かで進化し続ける言語ですが、それを使用していないのは夢中です。 ILで働くことは罰であろう。できるだけ良いILにC#をコンパイルすることができます。

最新のC#のすべての種類の機能を自由に使用することもできます。ダイナミックのようなものは最高のパフォーマンスを持たないかもしれませんが、パフォーマンスに関してではなく、モダンな機能を使って物事を進めるのに役立ちます。イリノイ州はそれをあなたに与えません。 (もちろん、いくつかの新機能は非同期のようなパフォーマンスを助けますが、アセンブリレベルの最適化とは非常に高いレベルではありません)。

そして、AFAIKではILをC#ファイル。オンザフライで新しいコードを生成することは別として、少なくともVisual Studioではなく、C#からビルドされたアセンブリの変更を含む特定のトリックを除いて、ILをアセンブリにコンパイルすることはできません。

+0

私はまっすぐILを書いて、私はhttp://msdn.microsoft.com/en-us/library/system.reflection.emit.ilgenerator%28v=vs.110%29.aspxを使ってIL opcodeを出すことを意味すると思います。 – dbarnes

+0

そして、[はるかに簡単な方法](http://msdn.microsoft.com/en-us/library/bb356928.aspx)で、オンザフライでコードを生成します。 –

+0

はい、式ツリーは、動的述語のコンパイルなど、LINQ用のものに非常に適しています。しかし、私の例、特にダイナミック・プロキシーの場合、クラスやアセンブリ全体をコンパイルしてインターフェースなどを実装する必要があるときは、ILだけがオプションです。 – fejesjoco

関連する問題