我对DynamicMethods,Expression Trees和DLR之间的交互和关系有一些疑问。DynamicMethods,Expression Trees和DLR
我知道LambdaExpression.Compile在内部使用一个ILGenerator创建一个Delegate。但是,编译的LambdaExpression和DynamicMethod之间有一些根本的区别。例如
a。 DynamicMethods调用速度更快
b。编译的LambdaExpressions可以嵌入闭包(ConstantExpressions是非原始值)
b。编译的LambdaExpressions没有DeclaringType。
问题:
a。为什么DynamicMethods比编译的LambdaExpressions更快地调用?
b。编译的LambdaExpressions允许关闭的特别之处是什么?当我使用非常量表达式时,表达式树实际上是否生成闭包类?如果是这样,这个生成的课程在哪里?
c。编译的LambdaExpressions在哪里(在运行时)?在哪里支持他们的实施。它不能只是Reflection.Emit,可以吗?
我知道动态关键字实际上只是一个用于发射CSharp CallSites,Binders等的编译器技巧。据我所知,这些生成表达式树并且还使用了C#编译器的精简版本。
问题
a。表达式树一般是由CallSiteBinders生成的函数,还是在Microsoft.CSharp dll中具体实现和使用它们?
b。这些表达式树是由DynamicExpression节点组成的吗?或者是其他东西?如果有其他事情,为什么?
c。 C#编译器的精简版本在哪里以及为什么会起作用?为什么以及它与定期调用LambdaExpression.Compile或DynamicMethods或任何类型的IL代有什么不同?我可以理解CallSiteBinder如何用于构建表达式树,但为什么在转换发生后需要C#编译器?一旦它以表达式树(这只是一个API)的形式,C#就完全可以做它。
为什么你认为'DynamicMethod'更快?你基于什么声称? – svick
另外,我想你提出的两个问题并没有真正相关。你可能应该问他们两个不同的问题。 – svick
我认为他们更快的个人经验,并在此引用http://stackoverflow.com/questions/1296683/curiosity-why-does-expression-when-compiled-run-faster-than-a-minimal-dyna(即使标题表明相反),这里http://stackoverflow.com/questions/10673756/net-dynamic-method-best-performance。虽然这个差异很小,我一直认为它只是在发射的IL上略有差异。 – Jeff