質問: 私の現在の理解は、このような「ハードコーディングされたコード」です: ``` publicÂ intÂ Add(intÂ x,Â intÂ y) {returnÂ xÂ +Â y;} ``` 次のような式のツリーコードよりも常に優れたパフォーマンスを発揮します。 ``` Expression>Â addÂ =Â (x,Â y)Â =>Â xÂ +Â y; varÂ resultÂ =Â add.Compile()(2,Â 3); varÂ xÂ =Â Expression.Parameter(typeof(int)); varÂ yÂ =Â Expression.Parameter(typeof(int)); returnÂ (Expression.Lambda(Expression.Add(x,Â y),Â x,Â y). Compile()Â asÂ Func)(2,Â 3); ``` コンパイラはより多くの情報を持っており、コンパイル時にコンパイルするとコードの最適化に多くの労力を費やすことができます。これは一般的に真実ですか?
回答: **編集** `Expression.Compile`の呼び出しは、次の意味でアプリケーションに含まれる他の.NETコードとまったく同じプロセスを実行します。 * ILコードが生成されます * ILコードはJITによってマシンコードに変換されます (式ツリーはすでに作成されており、入力コードから生成する必要がないため、解析ステップはスキップされます) 式コンパイラのソースコードを見て、実際にILコードが生成されていることを確認できます。 **最適化** CLRによって行われる最適化のほぼすべてが、C#ソースコードのコンパイルからではなく、JITステップで行われることに注意してください。この最適化は、ラムダデリゲートからマシンコードにILコードをコンパイルするときにも行われます。 **あなたの例** あなたの例では、リンゴとオレンジを比較しています。最初の例はメソッド定義で、2番目の例はメソッドを作成し、コンパイルして実行するランタイムコードです。メソッドの作成/コンパイルにかかる時間は、実際に実行するよりもはるかに長くなります。ただし、作成後にコンパイル済みメソッドのインスタンスを保持できます。完了したら、生成されたメソッドのパフォーマンスは、元のC#メソッドのパフォーマンスと同じになります。 この場合を考えてみましょう: ``` private static int AddMethod(int a, int b) { return a + b; } Func add1 = (a, b) => a + b; Func add2 = AddMethod; var x = Expression.Parameter(typeof (int)); var y = Expression.Parameter(typeof (int)); var additionExpr = Expression.Add(x, y); Func add3 = Expression.Lambda>( additionExpr, x, y).Compile(); //the above steps cost a lot of time, relatively. //performance of these three should be identical add1(1, 2); add2(1, 2); add3(1, 2); ``` 結論は、ILコードは生成方法に関係なくILコードであり、Linq ExpressionsはILコードを生成します。