3

这是一个菜鸟问题。我有一个简单的财产

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

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

我喜欢保持这样,因为它使代码可读(对我来说),但我担心所有IsRoot调用都会减慢我的速度,因为它们可能不会在最终版本代码中“内联”。我所说的“内联”是指它们被parent==null评估的副本代替get_IsRoot().

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

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

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

4

1 回答 1

2

这是 Eric Gunnerson 的一篇关于内联的旧帖子。
要点是抖动决定是否内联函数。我的理解是,您可以通过编写小函数在某种程度上“鼓励”内联,但我不知道这到底有多可靠。

这是来自此处关于 SO 的问题的另一个链接,该链接提出了类似的问题。包括许多好的链接。

这是我发布的第二个链接中的一个链接的摘录:

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

我想这算是一个方法何时可能被内联的粗略指导,但我认为你不能说如果一个方法确实符合上述标准,它将被内联。

附带说明一下,您可以像这样强制一个函数不被内联:

[MethodImpl(MethodImplOptions.NoInlining)]
public void DoNotInlineMe()
{
  Console.WriteLine("Hello from non-inlined method");
}
于 2010-11-08T21:05:52.110 回答