何时是通过代码优化“内联”的属性

时间:2010-11-08 20:52:03

标签: c# performance properties inline compiler-optimization

这是一个菜鸟问题。我有一个简单的属性

bool IsRoot { get { return parent==null; } }

我从类(和派生类)中的其他属性和方法多次调用

我喜欢这样保留它,因为它使代码可读(对我来说),但我担心所有IsRoot调用都会让我慢下来,因为它们可能不会被“内联”最终发布代码。我所说的“内联”是指它们被parent==null评估的副本替换为get_IsRoot()

有人可以向我解释在C#中何时(或是否)内联属性,对于面向性能的应用程序,是否应该避免使用属性?

EDIT_1 :   简短的回答是:属性转换为纯函数调用,它们可能会或可能不会内联,具体取决于JIT决定的内容。信任系统做出正确的选择,不要担心可能影响5%-10%级别事物的事情,除非使用了分析器并且最终结果可以根据性能进行微调。

感谢SO社区的链接,我希望有一种方法可以奖励多个正确答案。对不起,我得选一个。

2 个答案:

答案 0 :(得分:4)

我认为这会回答你的问题

Does C# inline properties?

答案 1 :(得分:2)

讨论内联的

Here is an OLD post from Eric Gunnerson 要点是抖动决定是否要内联函数。我的理解是你可以通过编写小函数来“鼓励”某种程度的内联,但我不知道它是多么可靠。

Here is another link来自这里提出的一个类似问题的问题。包括许多好的链接。

以下摘自我发布的第二个链接中的一个链接:

  

经常使用的简短方法可以内嵌到调用代码中。目前,JIT被记录(可能在这里更加精确“博客”),内联方法的长度小于32个字节,不包含任何复杂的分支逻辑,并且不包含任何与异常处理相关的机制。有关此主题的一些其他信息,请参阅David Notario的博客(请注意,它与CLR 2.0并不完全相关)。

我认为这可以作为一个方法可能内联的粗略指导,但我不认为你可以说,如果一个方法符合上面的标准内联。

在旁注中,您可以强制函数不被内联,请执行以下操作:

[MethodImpl(MethodImplOptions.NoInlining)]
public void DoNotInlineMe()
{
  Console.WriteLine("Hello from non-inlined method");
}