标题问了这一切。在当今的代码中,我们非常广泛地使用 Action ,带有 Action 的表达式和回调。

JIT可以通过内联它们来优化这些调用吗?考虑到以一种形式使用回调模式,或者以如今荒谬的数量使用另一种形式,这将极大地提高性能。

JIT无法优化可能永远不会改变的 Action 。例如,我看不到不应优化标有“只读”属性的Action或Func的任何原因。

例如:

readonly Action a;
readonly Action a1;
readonly Action a2;

a = () => {};
a1 = () => { a() };
a2 = () => { a1() };

A2曾经优化过吗?我不知道为什么不应该这样做。

最佳答案

非优化本身与以下事实有关:不是最重要的函数本身,而是它们执行的代码。您为操作指定了const引用,但不能保证它们执行的代码不可变和/或能够产生恒定的行为。如果您不能保证或无法预测恒定行为,则内联通常不是一个好主意,因为您可能会有不可预测的执行流,因此行为是.net framework所针对的对象。

在您的具体示例中,我们有简单的“虚拟”函数,可能会产生一些内联,但是在我看来,这是一种非常特殊的情况,几乎不可能在某人的代码中发生,因此在.net framework中引入优化每个人的利益微不足道,因此,我猜这不是在CLR中实现的。

编辑

正如@Sriram Sakthivel所指出的那样:.net runtime中存在反射,因此功能的可能和不可预测的运行时更改可能是此处的主要干扰因素之一,以便允许框架确定给定的功能是否适合内联。

此外,@ Sriram Sakthivel的答案中的@hvd注释指出了为什么readonly关键字专门不能简单地保证确定性不变性的原因。

10-06 04:32
查看更多