簡體   English   中英

lambda 是否內聯?

[英]Do lambdas get inlined?

簡單的 lambda 表達式會被內聯嗎?

我傾向於(感謝 F# 和其他功能性嘗試)將單個函數中存在的重復代碼封裝到 lambda 中,然后調用它。 我很好奇我是否會因此產生運行時開銷:

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

對比

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

哪個運行成本更高?

回答性能問題:雙向運行十億次。 衡量每個的成本。 那你就知道了。 我們不知道您正在使用什么硬件,在您的相關場景中存在什么“噪音”,或者您認為什么是重要的性能指標。 你是唯一知道這些事情的人,所以你是唯一能回答這個問題的人。

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

首先,C# 編譯器從不內聯任何代碼。 jit 編譯器確實會內聯代碼,但 C# 編譯器生成 lambdas 作為委托實例這一事實意味着 jitter 不太可能合理地內聯此代碼。 (當然,抖動可以進行這種復雜的分析以確定委托中始終存在相同的代碼,但我不相信在實踐中已經實現了這些算法。)

如果你想內聯代碼,那么你應該把它寫成一行。 如果您不想將其寫入行內但仍希望將其內聯,那么您應該將其編寫為靜態方法並希望抖動內聯它。

但無論如何,這聽起來像是過早的優化。 用你想寫代碼的方式寫代碼,然后分析它的性能,然后重寫慢的東西。

不會。Lambda 函數不是內聯的,而是在后台存儲為委托,並產生與其他委托相同的執行成本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM