c# - 隐式转换和显式转换是否具有相同的性能?
问题描述
以 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;
解决方案
显式转换是否会增加额外的开销,尤其是对于大量/数字数组?还是与隐式转换相同?
您可以参考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 double
toint
只是移动值并返回一个组成部分,int
变得double
更复杂。因此,您可以看到不同的基准测试结果。
当然,这取决于使用的 CLR 和 .NET 版本(.NET Core 有很多改进,还添加了一些硬件内在函数)。我使用 .NET Core 和 CoreCLR 运行它,在 .NET Framework 中您会看到不同的结果。
您可以使用代码检查环境中的确切行为(至少因为您出于学术原因提出了问题)
推荐阅读
- android - Unity 游戏在 Android 设备上启动时崩溃。可以做些什么来克服这个问题?
- python - 如何在 Qutip 上的 Bloch 球体中绘制状态向量?
- bash - 如何使“for循环”递归
- image - 将 TensorBoard 图像序列转换为视频/GIF
- android - TWA Android 顶部网址栏未隐藏
- html - 使用 CSS 调整背景图像精灵组件的大小
- docker - 如何在 dockerimage 中添加/安装 cypress
- javascript - x 增量后触发代码
- amazon-web-services - 如何限制来自 EC2 实例的传出网络访问?
- javascript - 将 Qualtrics 问题定向到特定文件夹