2009-10-07 98 views
5

做簡單的lambda表達式是否內聯?做lambda表達式內聯?

我有一種傾向(感謝f#和其他功能突破)將單個函數中存在的重複代碼封裝到lambda中,並調用它。我很好奇,如果我是招致運行時開銷的結果:

var foo = a + b; 
var bar = a + b; 

v

Func<T1, T2> op =() => a + b; 
var foo = op(); 
var bar = op(); 

哪個成本更高運行?

回答

3

編號Lambda函數沒有內聯,而是作爲代理存儲在底層,並且與其他代表執行代價相同。

+1

*嘆*。那麼多小技巧。謝謝。 – kolosy 2009-10-07 04:00:37

7

要回答性能問題:兩種方式運行十億次。衡量每個人的成本。然後你就會知道。我們不知道您使用的是什麼硬件,您的相關場景中存在什麼「噪音」,或者您認爲什麼是重要的性能指標。你是唯一知道這些事情的人,所以你是唯一能夠回答問題的人。

要回答您的codegen問題:Jared是正確的,但答案可以擴展。

首先,C#編譯器從來沒有做內聯任何代碼。 jit編譯器不會內聯代碼,但C#編譯器生成lambda作爲委託實例的事實意味着抖動不可能合理地內聯該代碼。 (這當然是可能抖動做這個複雜的分析,以確定相同的代碼總是在代表,但我不認爲在實踐中這些算法已經實現。)

如果你想要內聯的代碼應該按照順序寫入。如果你不想把它寫成一行,但你仍然希望它內聯,那麼你應該把它寫成一個靜態方法,並希望抖動能夠將它嵌入。

但無論如何,這聽起來像是不成熟的優化。以您想要編寫代碼的方式編寫代碼,然後分析其性能,然後重寫慢速內容。