8

简单的 lambda 表达式会被内联吗?

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

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

对比

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

哪个运行成本更高?

4

2 回答 2

11

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

要回答您的代码生成问题:Jared 是正确的,但可以扩展答案。

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

如果你想内联代码,那么你应该把它写成一行。如果您不想将其写入行内但仍希望将其内联,那么您应该将其编写为静态方法并希望抖动内联它。

但无论如何,这听起来像是过早的优化。用你想写代码的方式写代码,然后分析它的性能,然后重写慢的东西。

于 2009-10-07T05:22:15.957 回答
6

不会。Lambda 函数不是内联的,而是在后台存储为委托,并产生与其他委托相同的执行成本。

于 2009-10-07T03:56:55.887 回答