lambdas内联吗?

时间:2009-10-07 03:52:20

标签: c#

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

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

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

v

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

哪一个要花费更多才能运行?

2 个答案:

答案 0 :(得分:8)

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

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

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

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

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

答案 1 :(得分:4)

没有。 Lambda函数不是内联的,而是作为代理存储在底层,并且与其他代理相同的执行成本。