6 c# optimization jit inline compiler-optimization
标题要求一切.我们在今天的代码中广泛使用动作,带动作的表达式和回调.
JIT可以通过内联来优化这些调用吗?考虑到回调模式,这将是一个巨大的性能提升,以一种形式或另一种形式使用今天的荒谬数量.
JIT无法优化可能永远不会更改的操作.例如,我没有看到为什么不应该优化标记为"readonly"属性的Action或Func的原因.
例如:
readonly Action a;
readonly Action a1;
readonly Action a2;
a = () => {};
a1 = () => { a() };
a2 = () => { a1() };
Run Code Online (Sandbox Code Playgroud)
IS a2曾经优化过吗?我没有看到它不应该的原因.
非优化本身与以下事实有关:重要的不是函数本身,而是它们执行的代码。您分配const对操作的引用,但不能保证它们执行的代码不可变和/或能够产生恒定的行为。如果您无法保证或预测某种恒定的行为,那么内联通常不是一个好主意,因为您可能会拥有不可预测的执行流程,因此行为,这不是什么.net framework。
在您的具体示例中,我们有简单的“虚拟”函数,可能会产生一些内联,但这在我看来是非常特殊的情况,并且极不可能在某人的代码中发生,因此引入优化可以忽略不.net framework计对每个人都有好处,因此,我想,没有实施CLR。
编辑
正如 @Sriram Sakthivel 所指出的: 中存在反射.net runtime,因此函数可能且不可预测的运行时更改可能是这里的主要干扰因素之一,以便允许框架确定给定函数是是否适合内联。
另外,@Sriram Sakthivel 的答案中的 @hvd 评论指出了为什么readonly关键字根本无法保证确定性不变性。