这是一个菜鸟问题。我有一个简单的属性
bool IsRoot { get { return parent==null; } }
我从类(和派生类)中的其他属性和方法多次调用
我喜欢这样保留它,因为它使代码可读(对我来说),但我担心所有IsRoot
调用都会让我慢下来,因为它们可能不会被“内联”最终发布代码。我所说的“内联”是指它们被parent==null
评估的副本替换为get_IsRoot()
。
有人可以向我解释在C#中何时(或是否)内联属性,对于面向性能的应用程序,是否应该避免使用属性?
EDIT_1 : 简短的回答是:属性转换为纯函数调用,它们可能会或可能不会内联,具体取决于JIT决定的内容。信任系统做出正确的选择,不要担心可能影响5%-10%级别事物的事情,除非使用了分析器并且最终结果可以根据性能进行微调。
感谢SO社区的链接,我希望有一种方法可以奖励多个正确答案。对不起,我得选一个。
答案 0 :(得分:4)
我认为这会回答你的问题
答案 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");
}