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


140

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

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

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

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

Answers:


176

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

例如:

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

但是,如果Microsoft在中发现了安全漏洞String.Equals,那么它们就不能只更新mscorlib.dll,因为这不会影响您只是NGen的程序集。(因为它具有未引用的原始机器代码String.Equals)。
我假设如果确实要发生这种情况,则此安全更新将清除NGen存储。

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


18
我们可以在自己的框架中使用此属性吗?我的开源库具有很多数学函数,这些函数将从中受益……
MattDavey

3
如果对.NET Framework进行了修补,则现有的本机映像文件将无效并重新创建(至少是我的理解)
Motti 2012年

14
@MattDavey不,您不应该在自己的代码中使用此属性。正如MSDN中所写:“此API支持.NET Framework基础结构,不能直接在您的代码中使用。” 此属性仅影响使用目标修补程序的程序集。可以在这里找到带有某些源链接的详细说明:stackoverflow.com/a/14982340/631802
cremor

25
我们所有的代码都可以自动跨程序集内联的事实,这意味着此属性对我们完全没有用,确实需要在答案中提及...
BlueRaja-Danny Pflughoeft13年

4
@MattDavey如果您想让编译器微调您的方法应尽可能内联,请使用[MethodImpl(MethodImplOptions.AggressiveInlining)]
基本
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.