TargetedPatchingOptOut:"对整个NGen图像边界内联的性能至关重要"?

Max*_*ich 140 .net c# compiler-construction ngen

使用反射器经历了一些框架类,并注意到许多方法和属性具有以下属性

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
Run Code Online (Sandbox Code Playgroud)

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

有人可以告诉我这在C#和其他任何背景下意味着什么?

SLa*_*aks 176

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

例如:

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

但是,如果微软发现安全漏洞String.Equals,他们不能只是更新mscorlib.dll,因为这不会影响你只是NGen的程序集.(因为它有原始机器代码而没有引用String.Equals).
我假设如果实际发生这种情况,安全更新将清除NGen商店.

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

  • 事实上我们的所有代码都可以在汇编范围内自动内联,这意味着这个属性对我们来说完全没用,**真的**需要在答案中提及...... (25认同)
  • 我们可以在自己的框架中使用此属性吗?我的开源库有很多数学函数,可以从中受益... (18认同)
  • @MattDavey不,你不应该在你自己的代码中使用这个属性.正如[MSDN](http://msdn.microsoft.com/en-us/library/system.runtime.targetedpatchingoptoutattribute%28v=vs.100%29.aspx)中所写:"此API支持.NET Framework基础设施,不应直接在您的代码中使用." 此属性仅影响使用目标修补的程序集.可以在此处找到有关源链接的更长解释:http://stackoverflow.com/a/14982340/631802 (14认同)
  • @MattDavey如果你想让编译器尽可能地推测你的方法应该被内联,请使用`[MethodImpl(MethodImplOptions.AggressiveInlining)]` (4认同)
  • 如果对.NET框架进行了修补,则现有的本机映像文件将被无效并重新创建(至少这是我的理解) (3认同)
  • @MattDavey`public sealed class TargetedPatchingOptOutAttribute:Attribute`它是mscorlib中的一个公共类,所以如果你将它应用到你自己的方法中,我不明白为什么它不会起作用. (2认同)