C#委托编译器优化

8

我开始在C#中经常使用匿名委托,我开始想知道编译器或运行时从实际运行的代码中删除它们的效率如何,但我没有看到详细说明。

它是否足够聪明,可以内联它们并折叠可以静态推导的递归使用?


3
你能提供一个你希望优化的案例的例子吗?请将其翻译成中文。 - SLaks
1
我怀疑编译器不会做任何事情来删除它们。然而,JITer可能会执行各种优化,其中包括内联这些函数。 - LBushkin
然而,我相信JITer不会内联委托。 - SLaks
在最复杂的层面上,我考虑通过部分函数实验创建复合对象。如果它不能做到这一点,那确实有点可惜 :( - iam
3个回答

3
不,C#编译器不会将Lambda表达式优化为内联代码。匿名委托和Lambda表达式将始终生成相应的委托或表达式树。这在C#语言规范的第6.5节中有所涵盖。

匿名方法表达式或Lambda表达式被归类为匿名函数(§7.14)。该表达式没有类型,但可以隐式转换为兼容的委托类型或表达式树类型。

在某些情况下,Lambda表达式将被缓存并用于后续使用,但不会被内联。

但是,你所引用的内容实际上是否意味着它们不会这样做 - 因为在我的看法中,这更多地涉及到用户视角下它们应该如何行事的概念,而不是优化器可能在背后执行的操作? - iam
@wb,虽然它没有直接说明,但这是一个要求。为了使用匿名函数,必须将其转换为委托。委托在 .Net 中是一级类型,可以被重写以在调用时执行任何操作。如果 C# 编译器内联委托,它可能会绕过用户定义的 DynamicInvokeImpl,从而破坏行为,因此不能内联它们。 - JaredPar

2
在大多数情况下,不需要担心这个问题。但是,除非您注意到实际的性能问题并已在分析器中跟踪了它们,否则您不应该担心它。

2

C#编译器不会对它们进行优化。但是,如果它们足够简单,.NET JIT编译器可能会进行优化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接