.NET核心:MethodImplOptions.AggressiveOptimization到底做什么?

.NET核心:MethodImplOptions.AggressiveOptimization到底做什么?,.net,optimization,.net-core,documentation,jit,.net,Optimization,.net Core,Documentation,Jit,MethodImplOptions.AggressiveOptimization到底做什么? 没告诉我多少。在哪些情况下它会有用?我会在文档中查找更多详细信息(如果您正在查找的话),而不是在上或中查找 让我们先看看后者。对于.net core 3.0,我们可以找到以下条目: 完全优化的JIT生成更高质量(或更优化)的代码的速度更慢。对于不使用快速JIT的方法(例如,如果该方法的属性为MethodImplOptions.AggressiveOptimization),则使用完全优化的JIT 因此,

MethodImplOptions.AggressiveOptimization
到底做什么?
没告诉我多少。在哪些情况下它会有用?

我会在文档中查找更多详细信息(如果您正在查找的话),而不是在上或中查找

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

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

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

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

关于这一点的讨论在本章中完成,本章对该主题提供了更多的细节

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

  • 对于分层,它可能会导致方法[…]立即使用第1层JIT
  • 它可以让JIT花费更多的JIT时间来生成更好的代码,比如更积极地内联到函数中
从这里我们可以得到一个答案,在什么情况下它可以被使用,但它下面在做什么

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

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


但最终的真相(我希望)和承诺与本次讨论有关,因此我们可以研究它们。从这些提交和提交消息中,我们可以看到分层编译和JIT实际上就是这样的(至少我可以看到这一点)。

所以这个标志只对分层编译有用,没有其他作用?这至少是我能找到的。它目前做两件事:(1)使该方法不符合预JIT的条件,(2)使该方法不符合分层编译的条件。最终的结果是,当第一次调用该方法时,该方法始终是JIT的,并且JIT代码得到了优化。仅当您发现为方法运行预jitted或Tier0代码会导致不必要的影响(性能损失或额外分配)时,才使用此标志。如果你没有看到这些不必要的影响,你最好不要使用该标志;常规的第1层代码通常比攻击性优化代码性能更好。@redhouan您应该知道什么是适合您的热门代码(评测?)。更多关于JIT如何知道哪些方法是更好的JIT候选方法的信息可以找到。JIT通过正常的Tier1重新JIT生成的代码通常比通过AggressiveOptimization生成的代码优化得更好。这里的关键区别是当方法的优化版本被JIT时。对于正常的Tier1 jit,它发生在进程生命周期的后期,因此jit可以更好地利用已经初始化的类——因此,正常的Tier1 jit代码不需要太多的类初始化检查,并且可以合并初始化类的只读静态值和类型。具有攻击性优化的方法被提前JIT,因此在这里失败。