编译器是否优化了不必要的/冗余的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
首先,这在很大程度上是一个微观优化。您应该担心代码的正确性和可读性。只有当您发现性能不佳的部分时,才能对其进行优化,并衡量您的优化是否真的有帮助。
其次,即使IL包含castclass
指令,它仍然可以在JITed汇编代码中进行优化,因此不会对性能产生任何影响。
第三,我想不出在任何情况下,上广播都需要castclass
(或任何其他指令)。这是因为在IL中,方法是由它们的元数据令牌直接调用的,所以不需要进行upcast来获得方法的正确重载或类似的东西。IL没有类型推理,所以在任何情况下都需要显式指定类型参数,这意味着这里也不需要castclass
。