gpt4 book ai didi

c# - 什么时候用短?

转载 作者:行者123 更新时间:2023-11-30 13:17:22 25 4
gpt4 key购买 nike

假设我正在循环遍历 20/30 个对象,或者在我处理较小数字的任何其他情况下,使用 short 而不是 int 是一个好习惯吗?

我的意思是为什么这不常见:

for(short i=0; i<x; i++)
Method(array[i]);

是不是性能提升太低了?

谢谢

最佳答案

“使用 short 而不是 int 是一个好习惯吗?”

首先,这是一个微优化,不会达到预期的结果:提高速度或效率。

其次:不,不是真的,CLR 内部仍然使用 32 位整数 (Int32) 来执行迭代。基本上,它会在 JIT 编译期间将 short 转换为 Int32 以用于计算目的。

第三:数组索引为Int32,迭代short变量作为数组索引器时会自动转为int32。

如果我们采用下一个代码:

    var array = new object[32];
var x = array.Length;
for (short i = 0; i < x; i++)
Method(array[i]);

反汇编它,您可以在 00000089 inc eax 处清楚地看到,在机器级别,一个 32 位寄存器用于迭代变量 (eax),接下来被截断为 16 位 0000008a movsx eax,ax 所以使用 short 与使用 int32 没有任何好处,实际上,由于需要执行额外的指令,可能会有轻微的性能损失。

00000042  nop 
var array = new object[32];
00000043 mov ecx,64B41812h
00000048 mov edx,20h
0000004d call FFBC01A4
00000052 mov dword ptr [ebp-50h],eax
00000055 mov eax,dword ptr [ebp-50h]
00000058 mov dword ptr [ebp-40h],eax
var x = array.Length;
0000005b mov eax,dword ptr [ebp-40h]
0000005e mov eax,dword ptr [eax+4]
00000061 mov dword ptr [ebp-44h],eax
for (short i = 0; i < x; i++)
00000064 xor edx,edx
00000066 mov dword ptr [ebp-48h],edx
00000069 nop
0000006a jmp 00000090
Method(array[i]);
0000006c mov eax,dword ptr [ebp-48h]
0000006f mov edx,dword ptr [ebp-40h]
00000072 cmp eax,dword ptr [edx+4]
00000075 jb 0000007C
00000077 call 657A28F6
0000007c mov ecx,dword ptr [edx+eax*4+0Ch]
00000080 call FFD9A708
00000085 nop
for (short i = 0; i < x; i++)
00000086 mov eax,dword ptr [ebp-48h]
00000089 inc eax
0000008a movsx eax,ax
0000008d mov dword ptr [ebp-48h],eax
00000090 mov eax,dword ptr [ebp-48h]
00000093 cmp eax,dword ptr [ebp-44h]
00000096 setl al
00000099 movzx eax,al
0000009c mov dword ptr [ebp-4Ch],eax
0000009f cmp dword ptr [ebp-4Ch],0
000000a3 jne 0000006C

关于c# - 什么时候用短?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9800550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com