首页 > 解决方案 > 隐式转换和显式转换是否具有相同的性能?

问题描述

以 w3school 为例:

int myInt = 9;
double myDouble = myInt;       // Automatic casting: int to double

Console.WriteLine(myInt);      // Outputs 9
Console.WriteLine(myDouble);   // Outputs 9

double myDouble = 9.78;
int myInt = (int) myDouble;    // Manual casting: double to int

Console.WriteLine(myDouble);   // Outputs 9.78
Console.WriteLine(myInt);      // Outputs 9

显式转换是否会增加额外的开销,尤其是对于大量/数字数组?还是与隐式转换相同?

出于学术原因,我不得不问这个问题,并且还想在任何地方显式地转换我的对象和接口以增加代码库的清晰度。

编辑

添加动物示例:

IAnimal animal = (IAnimal) dog;
IAnimal animal = dog;

标签: c#interfacecasting

解决方案


显式转换是否会增加额外的开销,尤其是对于大量/数字数组?还是与隐式转换相同?

您可以参考SharpLab以了解 IL 引擎盖下的差异。如您所见,逻辑几乎相同(当然,类型除外,因为您使用的是不同的类型)

.method public hidebysig 
instance float64 AutoCast () cil managed 
{
    .maxstack 8

    IL_0000: ldc.i4.s 9
    IL_0002: conv.r8
    IL_0003: ret
} // end of method C::AutoCast

.method public hidebysig 
instance int32 ManualCast () cil managed 
{
    .maxstack 8

    IL_0000: ldc.r8 9.78
    IL_0009: conv.i4
    IL_000a: ret
} // end of method C::ManualCast

甚至参考 ASM 代码

C.AutoCast()
    L0000: sub esp, 0x8
    L0003: vzeroupper
    L0006: vmovsd xmm0, qword [0x14540488]
    L000e: vmovsd [esp], xmm0
    L0013: fld qword [esp]
    L0016: add esp, 0x8
    L0019: ret

C.ManualCast()
    L0000: mov eax, 0x9
    L0005: ret

如您所见,cast doubletoint只是移动值并返回一个组成部分,int变得double更复杂。因此,您可以看到不同的基准测试结果。

在此处输入图像描述

当然,这取决于使用的 CLR 和 .NET 版本(.NET Core 有很多改进,还添加了一些硬件内在函数)。我使用 .NET Core 和 CoreCLR 运行它,在 .NET Framework 中您会看到不同的结果。

您可以使用代码检查环境中的确切行为(至少因为您出于学术原因提出了问题)


推荐阅读