何时使用short
本文关键字:short 何时使 | 更新日期: 2023-09-27 18:28:23
假设我正在循环遍历20/30个对象,或者在处理较小数字的任何其他情况下,使用short而不是int是一种好的做法吗?
我的意思是为什么这种情况不常见:
for(short i=0; i<x; i++)
Method(array[i]);
是因为性能增益太低吗?
感谢
"使用short而不是int是一种好的做法吗?"
首先,这是一个微观优化,不会达到预期的结果:提高速度或效率。
第二:不,不是真的,CLR内部仍然使用32位整数(Int32)来执行迭代。基本上,它将short转换为Int32,以便在JIT编译期间进行计算。
第三:数组索引为Int32,当用作数组索引器时,迭代短变量会自动转换为Int32。
如果我们采用下一个代码:
var array = new object[32];
var x = array.Length;
for (short i = 0; i < x; i++)
Method(array[i]);
拆开它,你可以在00000089 inc eax
中清楚地看到,在机器级,迭代变量(eax)使用了一个32位寄存器,下一个被截断为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
是的,性能差异可以忽略不计。然而,short使用16位而不是32位来表示int,因此可以想象,如果您正在处理足够小的数字,则可能需要使用short。
通常,使用与处理器的单词大小相匹配的数字比不匹配的数字相对较快。另一方面,short使用的内存空间比int少。如果您的内存空间有限,可以使用short;但就我个人而言,我在编写c应用程序时从未遇到过这样的事情。
int
使用32位内存,short
使用16位,byte
使用8位。如果您只在20/30个对象中循环,并且担心内存使用,请改用byte
。
在今天的机器中,很少需要将内存使用量满足到这个级别,尽管您可能会认为在任何地方使用int
都是懒惰的。就我个人而言,我总是尽量使用使用最少内存的相关类型。
http://msdn.microsoft.com/en-us/library/5bdb6693(v=vs.100).aspx