2012-03-21 1 views
3

20/30 개체처럼 루핑 중이거나 작은 숫자를 다루는 다른 경우에는 int 대신 short를 사용하는 것이 좋습니다.짧은 사용시기는?

나는 왜이 일반적이지 의미 : 그것은 성능 향상이 너무 낮기 때문에

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

인가?

감사합니다.

+0

중복 [INT16 대 .NET 정수?] (http://stackoverflow.com/questions/129023/net-integer-vs-int16)의 –

+0

가능한 복제 [INT16 대 .NET 정수? (https://stackoverflow.com/questions/129023/net-integer-vs-int16) – DavidRR

답변

10

"는 것이 좋습니다 대신 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]); 

그리고 분해를, 당신은 기계 수준에서 32 비트 레지스터가 잘린 옆에있는 반복하는 변수 (EAX)에 사용되는 것을 00000089 inc 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 
+0

고마워. 그것은 물건을 깨끗이합니다. – farooq

+0

int를 통해 short 또는 byte를 사용하는 것이 유익 할 때가 언제입니까? – Sir

+0

글쎄, 조금 불쾌한 대답 ..... – Sir

1

예. 성능 차이는 무시할 수 있습니다. 그러나 short는 int 대신 32 비트가 아닌 16 비트를 사용하기 때문에 충분한 작은 숫자를 처리하는 경우 short를 사용하는 것이 좋습니다.

1

일반적으로 프로세서의 단어 크기와 일치하는 숫자를 사용하면 일치하지 않는 숫자보다 상대적으로 빠릅니다. 반면에 short는 int보다 메모리 공간을 덜 사용합니다. 제한된 메모리 공간이있는 경우 단락을 사용하는 것이 좋습니다. 개인적으로 C# 응용 프로그램을 작성할 때 개인적으로 그런 일이 발생하지 않았습니다.

0

int은 32 비트 메모리를 사용하고, short은 16 비트를 사용하고 byte은 8 비트를 사용합니다. 20/30 개의 객체를 반복하면서 메모리 사용에 대해 염려한다면 byte을 대신 사용하십시오.

int을 사방에 사용하는 것이 게으른 것이라고 주장 할 수 있지만,이 수준의 메모리 사용량에 대한 요식은 거의 필요하지 않습니다. 개인적으로 항상 최소한의 메모리를 사용하는 관련 유형을 사용하려고합니다.

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