TargetedPatchingOptOut:“性能对于跨 NGen 映像边界内联至关重要”?

TargetedPatchingOptOut: "Performance critical to inline across NGen image boundaries"?

提问人:Maxim Gershkovich 提问时间:5/24/2011 最后编辑:Maxim Gershkovich 更新时间:10/1/2014 访问量:14039

问:

一直在使用 reflector 浏览一些框架类,并注意到许多方法和属性具有以下属性

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]

我很确定我也在其他地方看到了上述评论,但从未跟进过。

有人可以告诉我这在 C# 和任何其他上下文中意味着什么吗?

C# .NET 编译器构造 NGen

评论


答:

176赞 SLaks 5/24/2011 #1

它告诉 NGen,即使在不同的程序集中,也可以内联它所应用的方法。

例如:

  • String.Equals[TargetedPatchingOptOut]
  • 你编写一个程序,调用String.Equals
  • 在此程序上运行 NGen 以获得最佳性能
  • NGen 将内联调用,将方法调用指令替换为方法中的实际代码。
    方法调用(略微)昂贵,因此对于经常调用的方法来说,这是一种性能提升。
    String.Equals

但是,如果 Microsoft 发现 中存在安全漏洞,则不能只更新 ,因为这不会影响您刚刚 NGen'd 的程序集。(因为它有原始机器代码,没有引用)。
我假设如果这真的发生,安全更新将清除 NGen 存储。
String.Equalsmscorlib.dllString.Equals

请注意,此属性仅在 .NET Framework 程序集中有用。你自己不需要它。您可以在此处找到有关此内容的更多信息:https://stackoverflow.com/a/14982340/631802

评论

19赞 MattDavey 9/12/2011
我们可以在自己的框架中使用这个属性吗?我的开源库有很多数学函数,可以从中受益......
3赞 Motti 3/15/2012
如果修补了 .NET Framework,则现有的本机映像文件将失效并重新创建(至少这是我的理解)
16赞 cremor 2/20/2013
@MattDavey 不可以,不应在自己的代码中使用此属性。正如 MSDN 中所写的那样:“此 API 支持 .NET Framework 基础结构,不应在代码中直接使用。此属性仅影响使用目标修补的程序集。可以在此处找到带有一些源链接的更长的解释:stackoverflow.com/a/14982340/631802
29赞 BlueRaja - Danny Pflughoeft 5/3/2013
事实上,我们所有的代码都可以自动跨程序集边界内联,这意味着这个属性对我们来说完全没用,真的需要在答案中提到......
7赞 Basic 12/15/2014
@MattDavey 如果要提示编译器应尽可能内联方法,请使用[MethodImpl(MethodImplOptions.AggressiveInlining)]