.NET Core:MethodImplOptions.AggressiveOptimization 到底做了什么?

cod*_*nix 11 .net documentation optimization jit .net-core

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

Paw*_*sik 8

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

让我们首先看看后者。对于.net core 3.0,我们可以找到以下条目:

完全优化的 JIT 会以更慢的速度生成更高质量(或更优化)的代码。对于不使用快速 JIT 的方法(例如,如果该方法归因于 MethodImplOptions.AggressiveOptimization),则使用完全优化的 JIT。

因此,首先,我们知道,如果一个方法标记有这样的属性,则应该使用完全优化的 JIT 对其进行 JIT 处理,这可能会产生更好、更优化的代码 - 但会花费更多时间来编译。

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

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

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

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

由此我们可以得到答案,在什么情况下可以使用它,以及它在底层做什么。

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

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

但最终的真相(我希望)和承诺与此讨论相关,因此我们可以查看它们。从这些提交和提交消息中,我们可以了解到这实际上是分层编译和 JIT 所发生的情况(至少这是我所看到的)。