2009-10-07 104 views
5

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

我有一种倾向(感谢f#和其他功能突破)将单个函数中存在的重复代码封装到lambda中,并调用它。我很好奇,如果我是招致运行时开销的结果:

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

v

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

哪个成本更高运行?

回答

3

编号Lambda函数没有内联,而是作为代理存储在底层,并且与其他代表执行代价相同。

+1

*叹*。那么多小技巧。谢谢。 – kolosy 2009-10-07 04:00:37

7

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

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

首先,C#编译器从来没有做内联任何代码。 jit编译器不会内联代码,但C#编译器生成lambda作为委托实例的事实意味着抖动不可能合理地内联该代码。 (这当然是可能抖动做这个复杂的分析,以确定相同的代码总是在代表,但我不认为在实践中这些算法已经实现。)

如果你想要内联的代码应该按照顺序写入。如果你不想把它写成一行,但你仍然希望它内联,那么你应该把它写成一个静态方法,并希望抖动能够将它嵌入。

但无论如何,这听起来像是不成熟的优化。以您想要编写代码的方式编写代码,然后分析其性能,然后重写慢速内容。