C# c语言中的内联帮助器方法#

C# c语言中的内联帮助器方法#,c#,lambda,inline,C#,Lambda,Inline,从中我了解到,强烈建议使用C#进行内联是可能的,如下所示: using System.Runtime.CompilerServices; [MethodImpl(MethodImplOptions.AggressiveInlining)] bool MyCondition() { return someObject != null && someObject.Count > 2; } 在当前的项目中,我们使用框架定义的状态机,这会产生如下顺序(在我们的项目中更长):

从中我了解到,强烈建议使用C#进行内联是可能的,如下所示:

using System.Runtime.CompilerServices; 

[MethodImpl(MethodImplOptions.AggressiveInlining)]
bool MyCondition() { return someObject != null && someObject.Count > 2; }
在当前的项目中,我们使用框架定义的状态机,这会产生如下顺序(在我们的项目中更长):

为了简化这些结构,我想将lambda表达式(或动作委托)分离为helper方法(即最后一条语句)。这样做的原因是,使用正确的方法名将提高代码的可读性,其次,在自动生成文档时,它将使用方法名,而不是非直观的
[anonymous]
文本

然而,问题是,使用
aggressiveinline
是否有意义,或者JIT/编译器是否会自动内联包含多达4个变量和简单比较运算符的简单lambda表达式


我的直觉是内联这些方法,因为我相信状态机的不同部分会得到很多点击,因此减少方法调用将是一个好处。但是,JIT/编译器自动完成这项工作有多聪明?

问题在于,您对c语言中的lambdas理解不正确。当编译器将c#翻译成MSIL时,lambda就变成了类,所以您没有什么可内联的。你可以看看很棒的。所以,无论是否在外部类中定义lambda,都需要从堆中获取对象(我简化了编译代码的行为)。因此,正如我所想,应用程序的性能不会有任何差异。

还要记住,状态机将委托保留在其内部数据结构中。无法在此处内联保护操作


唯一可能的方法是内联helper方法调用的方法。

建议您尝试这两种方法并进行反编译,以查看IL的外观。(然后分析两者,看看JIT编译的输出是否以一种方式比另一种方式快。)(然后告诉我们您发现了什么,这将是您感兴趣的事情;-)您将需要使用AggressiveInline。请注意,在那篇文章中,对于方法是否可以内联还有其他限制。“我们应该忘记小效率,比如说97%的时间:过早优化是万恶之源。但我们不应该在关键的3%中放弃我们的机会”,Knuth说。请看。@yoyo:您能不能发布一个链接/参考资料,说明如何查看“IL是什么样子的”。我理解这个概念,但还没有做到这一点。你可以使用Microsoft()的ildasm.exe或类似ILSpy()的工具来反汇编托管程序集。我可能对lambdas的理解不正确,因为我知道如何使用它们,但不一定知道在幕后会发生什么。我刚才读到的(以及更新的问题)在条件中使用的动作委托是否也适用于此?@holroy是的,它适用。所有c#代表的执行方式(在IL级别)
fsm.In(States.A)
   .On(Events.B)
      .If(arguments => false).Goto(States.B1)
      .If(() => someVariable && somethingElse == false).Goto(States.B3);
      .If(MyCondition).Goto(States.B2)