我對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