什么时候用短?

far*_*ooq 3 c# short

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

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

for(short i=0; i<x; i++)
    Method(array[i]);
Run Code Online (Sandbox Code Playgroud)

是因为性能提升太低了吗?

谢谢

Pop*_*lin 13

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

首先,这是一种微观优化,无法达到预期的效果:提高速度或效率.

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

第三:数组索引是Int32,当用作数组索引器时,迭代短变量自动转换为int32.

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

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

并且反汇编它,你可以清楚地看到在 00000089 inc eax机器级别一个32位寄存器用于迭代变量(eax),接下来被截断为16位,0000008a movsx eax,ax 所以使用短路反对使用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
Run Code Online (Sandbox Code Playgroud)

  • 那么什么时候使用 Short 或 byte 比 int 更有利呢? (2认同)