何时使用short?

3

假设我需要循环20/30个对象,或者在其他处理较小数量的情况下,使用short而不是int是否是一个好习惯?

我的意思是,为什么这种情况不太普遍:

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

是因为性能提升太低吗?

谢谢


.NET Integer vs Int16? 的副本。 - Tim M.
可能是 .NET Integer vs Int16? 的重复问题。 - DavidRR
4个回答

15

“使用short而不是int是一个好的实践吗?”

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

其次:不是真的。CLR在内部仍然使用32位整数(Int32)进行迭代。基本上,在JIT编译期间对短整型进行了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

2
那么,在什么情况下使用short或byte比int更有益呢? - Sir

1

是的,性能差异可以忽略不计。然而,short使用16位而不是32位的int,因此如果您处理足够小的数字,可能希望使用short。


1

通常,使用与处理器字长匹配的数字比不匹配的数字要快得多。另一方面,short使用的内存空间比int少。 如果您的内存空间有限,则使用short可能是一种选择;但就个人而言,在编写c#应用程序时从未遇到过这样的情况。


0

int 使用32位内存,short 使用16位,byte 使用8位。如果您仅循环处理20/30个对象并且担心内存使用情况,请改用byte

尽管在今天的计算机上很少需要考虑到如此细微的内存使用问题,但有人可能会认为到处都使用int只是懒惰。个人而言,我尽量使用使用最少内存的相关类型。

http://msdn.microsoft.com/en-us/library/5bdb6693(v=vs.100).aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接