编译器是否优化了不必要的/冗余的upcast,或者是否生成任何IL

本文关键字:是否 或者 或者是 IL 任何 冗余 优化 不必要 编译器 upcast | 更新日期: 2023-09-27 18:21:53

From是否优化了冗余强制转换?我可以看到编译器并没有优化不必要的下变频(即castclass)。但现在我感兴趣的是一个更简单的例子,"编译器是否优化了不必要的upcast away?"这个问题只涉及引用类型,而不是boxing

在我看来,upcast不产生任何IL,因此冗余显式upcast根本不需要成本?还是因为IL指令是无类型的,所以冗余显式upcast在幕后仍有性能成本?

或者upcast有时会产生任何IL指令?

class Foo
{
}
class Bar : Foo
{
}
bool Test(object x)
{
    return x == null;
}
void Main()
{
    var x = new Bar();
    Console.Write(Test((Foo)x)); // redundant explicit to Foo, and then implicit to Object
    var y = new Bar();           // implicit to Object
    Console.Write(Test(y));
}
IL_0000:  newobj      UserQuery+Bar..ctor
IL_0005:  stloc.0     // x
IL_0006:  ldarg.0     
IL_0007:  ldloc.0     // x
IL_0008:  call        UserQuery.Test
IL_000D:  call        System.Console.Write
IL_0012:  newobj      UserQuery+Bar..ctor
IL_0017:  stloc.1     // y
IL_0018:  ldarg.0     
IL_0019:  ldloc.1     // y
IL_001A:  call        UserQuery.Test
IL_001F:  call        System.Console.Write

编译器是否优化了不必要的/冗余的upcast,或者是否生成任何IL

首先,这在很大程度上是一个微观优化。您应该担心代码的正确性和可读性。只有当您发现性能不佳的部分时,才能对其进行优化,并衡量您的优化是否真的有帮助。

其次,即使IL包含castclass指令,它仍然可以在JITed汇编代码中进行优化,因此不会对性能产生任何影响。

第三,我想不出在任何情况下,上广播都需要castclass(或任何其他指令)。这是因为在IL中,方法是由它们的元数据令牌直接调用的,所以不需要进行upcast来获得方法的正确重载或类似的东西。IL没有类型推理,所以在任何情况下都需要显式指定类型参数,这意味着这里也不需要castclass

相关文章: