【问题标题】:TargetedPatchingOptOut: "Performance critical to inline across NGen image boundaries"?TargetedPatchingOptOut:“跨 NGen 图像边界内联的性能至关重要”?
【发布时间】:2011-08-31 20:55:07
【问题描述】:

浏览了一些使用反射器的框架类,注意到一些方法和属性具有以下属性

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

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

有人可以告诉我这在 C# 和任何其他上下文中的含义吗?

【问题讨论】:

    标签: c# .net compiler-construction ngen


    【解决方案1】:

    它告诉 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

    【讨论】:

    • 我们可以在我们自己的框架中使用这个属性吗?我的开源库有很多数学函数可以从中受益......
    • 如果对 .NET 框架进行了修补,现有的本机图像文件将失效并重新创建(至少这是我的理解)
    • @MattDavey 不,您不应该在自己的代码中使用此属性。正如MSDN 中所写:“此 API 支持 .NET Framework 基础结构,不打算直接从您的代码中使用。”。此属性仅影响使用目标修补的程序集。可以在此处找到带有一些源链接的更长解释:stackoverflow.com/a/14982340/631802
    • 我们所有的代码都可以自动跨程序集边界内联,这意味着这个属性对我们完全没用,真的需要在答案中提及......
    • @MattDavey 如果您想让编译器提示您的方法应该尽可能内联,请使用[MethodImpl(MethodImplOptions.AggressiveInlining)]
    猜你喜欢
    • 1970-01-01
    • 2018-12-24
    • 2019-07-28
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多