首页 > 解决方案 > .NET Core:MethodImplOptions.AggressiveOptimization 究竟做了什么?

问题描述

具体是做什么MethodImplOptions.AggressiveOptimization的? 微软的文档并没有告诉我太多。它在哪些情况下有用?

标签: .netoptimization.net-coredocumentationjit

解决方案


我会在文档中而不是在.net core github发行说明中寻找更多详细信息(如果这是您正在寻找的)。

让我们从后者开始。对于 .net core 3.0,我们可以找到以下条目:

完全优化的 JIT 更慢地生成更高质量(或更优化)的代码。对于不使用 Quick JIT 的方法(例如,如果该方法具有 MethodImplOptions.AggressiveOptimization 属性),则使用完全优化的 JIT。

因此,首先,我们知道如果一个方法被标记了这样的属性,它应该被完全优化的 JIT 进行 JIT,这可能会产生更好、更优化的代码——但会花费更多的时间来编译。

现在让我们关注 github,看看我们能在那里找到什么。

有关此问题的讨论已在此票证中完成,并提供了有关该主题的更多详细信息。

该标志可用于 MethodImplAttribute 以指示该方法包含热代码:

  • 对于分层,它可能导致第 1 层 JIT 立即用于方法 [...]
  • 它可以让 JIT 花费更多的 JIT 时间来生成更好的代码,例如更积极地内联到函数中

从中我们可以得到答案,在哪些情况下可以使用它,以及它在下面做什么。

在我们处理热路径代码的情况下 - 此属性对于 JIT 很有用,可以生成更快、更优化的代码,而不是进行分层编译。如果运行时检测到它实际上在热路径上,则在开始时使用更多时间可以节省时间。

还有一个关于这个标志的其他用法的有趣讨论,你可以阅读。

但是最终的真相(我希望)和提交与这个讨论有关,所以我们可以看看它们。从这些提交和提交消息中,我们可以知道这实际上是分层编译和 JIT 正在发生的事情(至少这是我能看到的)。


推荐阅读