.net - .NET Core:MethodImplOptions.AggressiveOptimization 究竟做了什么?
问题描述
具体是做什么MethodImplOptions.AggressiveOptimization
的?
微软的文档并没有告诉我太多。它在哪些情况下有用?
解决方案
我会在文档中而不是在.net core github或发行说明中寻找更多详细信息(如果这是您正在寻找的)。
让我们从后者开始。对于 .net core 3.0,我们可以找到以下条目:
完全优化的 JIT 更慢地生成更高质量(或更优化)的代码。对于不使用 Quick JIT 的方法(例如,如果该方法具有 MethodImplOptions.AggressiveOptimization 属性),则使用完全优化的 JIT。
因此,首先,我们知道如果一个方法被标记了这样的属性,它应该被完全优化的 JIT 进行 JIT,这可能会产生更好、更优化的代码——但会花费更多的时间来编译。
现在让我们关注 github,看看我们能在那里找到什么。
有关此问题的讨论已在此票证中完成,并提供了有关该主题的更多详细信息。
该标志可用于 MethodImplAttribute 以指示该方法包含热代码:
- 对于分层,它可能导致第 1 层 JIT 立即用于方法 [...]
- 它可以让 JIT 花费更多的 JIT 时间来生成更好的代码,例如更积极地内联到函数中
从中我们可以得到答案,在哪些情况下可以使用它,以及它在下面做什么。
在我们处理热路径代码的情况下 - 此属性对于 JIT 很有用,可以生成更快、更优化的代码,而不是进行分层编译。如果运行时检测到它实际上在热路径上,则在开始时使用更多时间可以节省时间。
还有一个关于这个标志的其他用法的有趣讨论,你可以阅读。
但是最终的真相(我希望)和提交与这个讨论有关,所以我们可以看看它们。从这些提交和提交消息中,我们可以知道这实际上是分层编译和 JIT 正在发生的事情(至少这是我能看到的)。
推荐阅读
- c++ - 如何从上层类调用函数?该类没有被继承
- html-agility-pack - UTF-8 不是 HTML Agility Pack 中支持的编码名称
- mysql - 具有 NULL 值的 mysql DATEDIFF
- python - 使用页码弹性搜索的分页
- google-identity - Google One Tap 引发错误并显示神秘信息
- c# - 从上下文手动映射列表
- python - DeepFace 用于提取图像的矢量信息
- javascript - 如何从 JS 调用 Rust 并返回?
- postgresql - 使用 T 分隔日期和时间是否与 RFC3339 不一致?
- android - 每个项目的导航视图中的文本颜色不同?