2013-05-13 8 views
6

式ツリーを構築するのではなく、ILを直接発行するメソッドを作成するとパフォーマンスに違いはありますか?より早いもの:式ツリーまたは手作業でのILの生成

+4

これはすでに試したことがありますので、結果をお知らせください。 –

+1

私は実際にやってみようとしています。表現木がコンパイルされる方法にいくつかの基本的な違いがあります。たとえば、リフレクションによってメソッドがどのように実行されるか、式ツリーから呼び出されたときや動的バインディングを介して呼び出されたときなど、メソッドの実行方法と基本的な違いがあります。だから私は、 "コンパイル"表現木が何らかの意味でILが手で生成するものとは異なる結果を生み出すのだろうかと思います。 – sircodesalot

+2

両方の方法で試してみて、ストップウォッチを手に入れてください。すぐにわかるでしょう。それが知る唯一の方法です。 –

答えて

6

最終的に表現ツリーのAPIは、relection.emitよりもわかりやすいAPIなので、効果的には同等ですが、直接的なリフレクションで表現木で行うことはできないことがたくさんあると思います。放出する。

Reflection.Emitは全体的に最も速いですが、forループがforeachよりも速いのと同じように一般にです。 reflection.emitを使用してより速く実行するコードを、式apiを使用するよりも速く書くことができる多くのシナリオがありますが、ほとんどの場合、等価になるはずです。

ここで、式APIは、いくつかの理由で少し上手くやっています。

  1. 直接反射.emitを使用するより簡単な方法で構成できます。式ツリーを使用して、直接ロジックを使用するよりも簡単にロジックを追加することができます
  2. 今後、方向リフレクションを使用するときには理解できない最適化が追加されることがあります.emit。

最終的に、私は洗濯だと言います。本当に重要でreflection.emitがよく分かっているのであれば、通常、式APIを使用しないILのショートカットをいくつか取ることができますが、それ以外の一般的な使い方では、かなり同等でなければなりません。

+1

パーフェクト。これは私が何をしたのかの中心にあります、ありがとう。 – sircodesalot

+1

reflection.emitおよび/またはexpression apiの世界への旅には問題はありません。 –

9

優秀で複雑な質問です。最近まで、Expressionは単純にすべてのシナリオを処理できませんでした。したがって、多くの場合、それは非質問でした。これはExpression.Blockなどの導入によって変化します。ほとんどの「一般的な」ケースでは、表現の使用はおそらくそれ以上のものですが、私は精密な測定値を持っていないと告白します。 Expressionのような贅沢を持たない下位レベルのフレームワークも対象としています(もちろんExpression.Blockは対象外です)。私はILの体操をうまく積み重ねるのに、表現には必ずしも適していない複雑な「デコレータ」のアプローチを使用する傾向があります(実際にはあなたのILはリフレクターなどがそれと闘うほど非定型であれば、表現にきれいに - そして私のILはかなりぎこちない傾向があります)。

申し訳ありませんが、私はあなたより多くの数値データを与えることはできません - キーポイント:

  • あなたはダウンレベルのフレームワークの要件がある場合の質問はそう
  • 議論の余地がある、あなたは をプロファイルする必要があると思います
関連する問題