C# lambda是内联的吗?
简单的lambda表达式是否内联 我倾向于(多亏了F#和其他函数的尝试)将单个函数中的重复代码封装到lambda中,并调用它。我很好奇我是否因此产生了运行时开销:C# lambda是内联的吗?,c#,lambda,inlining,C#,Lambda,Inlining,简单的lambda表达式是否内联 我倾向于(多亏了F#和其他函数的尝试)将单个函数中的重复代码封装到lambda中,并调用它。我很好奇我是否因此产生了运行时开销: var foo = a + b; var bar = a + b; vs Func op=()=>a+b; var foo=op(); var bar=op(); 哪一个运行成本更高?否。Lambda函数不是内联的,而是作为代理存储在引擎盖下,执行成本与其他代理相同 回答性能问题:双向运行10亿次。衡量每个项目的成本。那你就知道了
var foo = a + b;
var bar = a + b;
vs
Func op=()=>a+b;
var foo=op();
var bar=op();
哪一个运行成本更高?否。Lambda函数不是内联的,而是作为代理存储在引擎盖下,执行成本与其他代理相同 回答性能问题:双向运行10亿次。衡量每个项目的成本。那你就知道了。我们不知道你在用什么硬件,你的相关场景中有什么“噪音”,或者你认为是一个重要的性能指标。你是唯一知道这些事情的人,所以你是唯一能回答这个问题的人 回答您的codegen问题:Jared是正确的,但答案可以进一步扩展 首先,C#编译器从不内联任何代码。jit编译器确实进行代码内联,但C#编译器生成lambda作为委托实例这一事实意味着抖动不太可能合理地内联此代码。(抖动当然可以进行这种复杂的分析,以确定代理中始终存在相同的代码,但我不相信在实践中已经实现了这些算法。) 如果您希望代码内联,那么您应该将其写入第行。如果您不想将其写入行,但仍然希望将其内联,那么您应该将其作为静态方法写入,并希望抖动将其内联 但无论如何,这听起来像是过早的优化。按照您希望的方式编写代码,然后分析其性能,然后重写那些慢的东西
Func<T1, T2> op = () => a + b;
var foo = op();
var bar = op();