我最近了解到可以在運行時生成C#代碼,並且希望使用此功能。我有一些代碼可以執行一些非常基本的幾何計算,例如計算線平面交叉,我認爲通過爲某些方法生成專用代碼可以獲得一些性能優勢,因爲許多計算都是針對同一平面執行的,並重新開始。通過專門計算交叉點的代碼,我認爲我應該能夠獲得一些性能優勢。表達式樹vs IL.Emit用於運行時代碼專業化
問題是我不知道從哪裏開始。從閱讀一些博客文章和瀏覽MSDN文檔,我已經遇到了兩種可能的運行時生成代碼的策略:表達式樹和IL.Emit。使用表達式樹似乎容易得多,因爲不需要學習任何有關OpCodes和其他各種複雜的MSIL的知識,但我不確定表達式樹是否與手動生成的MSIL一樣快。那麼對於我應該採用哪種方法,有什麼建議嗎?
我想補充一點,編寫你自己的IL充滿了錯過C#編譯器可能找到的優化的機會。您可能想要發出實際的C#,並使用C#編譯器生成您的結果程序集:http://msdn.microsoft.com/en-us/library/microsoft.cscrp.cfrprocode.aspx – 2012-01-15 02:48:54
@ChrisShain,不幸的是,C#編譯器沒有做任何有趣的可能優化。由於某種原因,甚至C++/CLI也做得更多。這就是爲什麼我更願意自行生成代碼,繞過C#有限優化功能。有些東西很容易實現,但在C#中缺少 - 適當的常量傳播,常量參數專業化(帶內聯),區域分析和分配消除,循環展開,變量合併,循環不變吊裝等。 – 2012-01-18 10:51:14
C#編譯器不會執行這些優化,是否這個責任在JIT編譯器中。這裏的推理是通過將諸如循環展開的優化移動到JIT編譯器,它們被應用於所有的.NET語言。當然,JIT編譯器不會循環展開,內聯和更多。 – 2013-10-28 10:07:51