lambdas内联吗?

kol*_*osy 6 c#

简单的lambda表达式是否内联?

我有一种趋势(感谢f#和其他功能性的尝试)将单个函数中存在的重复代码封装到lambda中,然后调用它.我很好奇,如果我因此导致运行时开销:

var foo = a + b;
var bar = a + b;
Run Code Online (Sandbox Code Playgroud)

v

Func<T1, T2> op = () => a + b;
var foo = op();
var bar = op();
Run Code Online (Sandbox Code Playgroud)

哪一个运行成本更高?

Eri*_*ert 9

回答性能问题:双向运行十亿次.衡量每个的成本.然后你就会知道.我们不知道您使用的硬件,相关方案中存在的"噪音",或您认为重要的性能指标.你是唯一知道这些事情的人,所以你是唯一能回答这个问题的人.

回答你的codegen问题:Jared是正确的,但答案可以扩展.

首先,C#编译器永远不会内联任何代码.jit编译器确实进行了代码内联,但C#编译器生成lambdas作为委托实例的事实意味着抖动不太可能合理地内联此代码.(抖动当然可以通过这种复杂的分析来确定相同的代码始终在委托中,但我不相信在实践中这些算法已经实现.)

如果您希望代码内联,那么您应该将其写入内联.如果您不想在线编写它但仍希望它内联,那么您应该将其编写为静态方法并希望抖动内联它.

但无论如何,这听起来像是过早的优化.以您希望编写代码的方式编写代码,然后分析其性能,然后重写缓慢的东西.


Jar*_*Par 5

不能。Lambda函数不是内联的,而是作为代理存储在后台,并且产生与其他代理相同的执行成本。