kyuseo의 게임 프로그래밍
int, short, byte 자료형의 복사, 비교 구문의 속도를 비교 분석 본문
개요.. |
int, short, byte 자료형의 복사, 비교 구문의 속도를 비교 분석해봅니다.
비교 분석 |
1. 아래코드 [A]를 복사하여 코드를 삽입하고
2. F9로 디버깅 브레이크를 설정하고
3. F5를 눌러 실행한 이후
4. Alt-8 을 눌러보면
5. [B] 와 같은 어셈블리 코드가 나옵니다.
[A]
int t = 0; int a = 1; short b = 2; BYTE c = 3;
int a0 = 1; short b0 = 2; BYTE c0 = 3;
int a1 = a+a0; int a2 = a+b0; int a3 = a+c0;
short b1 = b+a0; short b2 = b+b0; short b3 = b+c0;
short c1 = c+a0; short c2 = c+b0; short c3 = c+c0;
if( a < a0 ) t = 0; if( a < b0 ) t = 0; if( a < c0 ) t = 0 ;
if( b < a0 ) t = 0; if( b < b0 ) t = 0; if( b < c0 ) t = 0 ;
if( c < a0 ) t = 0; if( c < b0 ) t = 0; if( c < c0 ) t = 0 ; |
[B]
79: int t = 0; 0042CE73 mov dword ptr [ebp-14h],0 80: int a = 1; 0042CE7A mov dword ptr [ebp-18h],1 81: short b = 2; 0042CE81 mov word ptr [ebp-1Ch],offset CMainWnd::CMainWnd+365h (0042ce85) 82: BYTE c = 3; 0042CE87 mov byte ptr [ebp-20h],3 83: 84: int a0 = 1; 0042CE8B mov dword ptr [ebp-24h],1 85: short b0 = 2; 0042CE92 mov word ptr [ebp-28h],offset CMainWnd::CMainWnd+376h (0042ce96) 86: BYTE c0 = 3; 0042CE98 mov byte ptr [ebp-2Ch],3 87: 88: int a1 = a+a0; 0042CE9C mov edx,dword ptr [ebp-18h] 0042CE9F add edx,dword ptr [ebp-24h] 0042CEA2 mov dword ptr [ebp-30h],edx 89: int a2 = a+b0; 0042CEA5 movsx eax,word ptr [ebp-28h] 0042CEA9 mov ecx,dword ptr [ebp-18h] 0042CEAC add ecx,eax 0042CEAE mov dword ptr [ebp-34h],ecx 90: int a3 = a+c0; 0042CEB1 mov edx,dword ptr [ebp-2Ch] 0042CEB4 and edx,0FFh 0042CEBA mov eax,dword ptr [ebp-18h] 0042CEBD add eax,edx 0042CEBF mov dword ptr [ebp-38h],eax 91: 92: short b1 = b+a0; 0042CEC2 movsx ecx,word ptr [ebp-1Ch] 0042CEC6 add ecx,dword ptr [ebp-24h] 0042CEC9 mov word ptr [ebp-3Ch],cx 93: short b2 = b+b0; 0042CECD movsx edx,word ptr [ebp-1Ch] 0042CED1 movsx eax,word ptr [ebp-28h] 0042CED5 add edx,eax 0042CED7 mov word ptr [ebp-40h],dx 94: short b3 = b+c0; 0042CEDB movsx ecx,word ptr [ebp-1Ch] 0042CEDF mov edx,dword ptr [ebp-2Ch] 0042CEE2 and edx,0FFh 0042CEE8 add ecx,edx 0042CEEA mov word ptr [ebp-44h],cx 95: 96: short c1 = c+a0; 0042CEEE mov eax,dword ptr [ebp-20h] 0042CEF1 and eax,0FFh 0042CEF6 add eax,dword ptr [ebp-24h] 0042CEF9 mov word ptr [ebp-48h],ax 97: short c2 = c+b0; 0042CEFD mov ecx,dword ptr [ebp-20h] 0042CF00 and ecx,0FFh 0042CF06 movsx edx,word ptr [ebp-28h] 0042CF0A add ecx,edx 0042CF0C mov word ptr [ebp-4Ch],cx 98: short c3 = c+c0; 0042CF10 mov eax,dword ptr [ebp-20h] 0042CF13 and eax,0FFh 0042CF18 mov ecx,dword ptr [ebp-2Ch] 0042CF1B and ecx,0FFh 0042CF21 add eax,ecx 0042CF23 mov word ptr [ebp-50h],ax 99: 100: if( a < a0 ) 0042CF27 mov edx,dword ptr [ebp-18h] 0042CF2A cmp edx,dword ptr [ebp-24h] 0042CF2D jge CMainWnd::CMainWnd+416h (0042cf36) 101: t = 0; 0042CF2F mov dword ptr [ebp-14h],0 102: if( a < b0 ) 0042CF36 movsx eax,word ptr [ebp-28h] 0042CF3A cmp dword ptr [ebp-18h],eax 0042CF3D jge CMainWnd::CMainWnd+426h (0042cf46) 103: t = 0; 0042CF3F mov dword ptr [ebp-14h],0 104: if( a < c0 ) 0042CF46 mov ecx,dword ptr [ebp-2Ch] 0042CF49 and ecx,0FFh 0042CF4F cmp dword ptr [ebp-18h],ecx 0042CF52 jge CMainWnd::CMainWnd+43Bh (0042cf5b) 105: t = 0 ; 0042CF54 mov dword ptr [ebp-14h],0 106: 107: if( b < a0 ) 0042CF5B movsx edx,word ptr [ebp-1Ch] 0042CF5F cmp edx,dword ptr [ebp-24h] 0042CF62 jge CMainWnd::CMainWnd+44Bh (0042cf6b) 108: t = 0; 0042CF64 mov dword ptr [ebp-14h],0 109: if( b < b0 ) 0042CF6B movsx eax,word ptr [ebp-1Ch] 0042CF6F movsx ecx,word ptr [ebp-28h] 0042CF73 cmp eax,ecx 0042CF75 jge CMainWnd::CMainWnd+45Eh (0042cf7e) 110: t = 0; 0042CF77 mov dword ptr [ebp-14h],0 111: if( b < c0 ) 0042CF7E movsx edx,word ptr [ebp-1Ch] 0042CF82 mov eax,dword ptr [ebp-2Ch] 0042CF85 and eax,0FFh 0042CF8A cmp edx,eax 0042CF8C jge CMainWnd::CMainWnd+475h (0042cf95) 112: t = 0 ; 0042CF8E mov dword ptr [ebp-14h],0 113: 114: if( c < a0 ) 0042CF95 mov ecx,dword ptr [ebp-20h] 0042CF98 and ecx,0FFh 0042CF9E cmp ecx,dword ptr [ebp-24h] 0042CFA1 jge CMainWnd::CMainWnd+48Ah (0042cfaa) 115: t = 0; 0042CFA3 mov dword ptr [ebp-14h],0 116: if( c < b0 ) 0042CFAA mov edx,dword ptr [ebp-20h] 0042CFAD and edx,0FFh 0042CFB3 movsx eax,word ptr [ebp-28h] 0042CFB7 cmp edx,eax 0042CFB9 jge CMainWnd::CMainWnd+4A2h (0042cfc2) 117: t = 0; 0042CFBB mov dword ptr [ebp-14h],0 118: if( c < c0 ) 0042CFC2 mov ecx,dword ptr [ebp-20h] 0042CFC5 and ecx,0FFh 0042CFCB mov edx,dword ptr [ebp-2Ch] 0042CFCE and edx,0FFh 0042CFD4 cmp ecx,edx 0042CFD6 jge CMainWnd::CMainWnd+4BFh (0042cfdf) 119: t = 0 ; 0042CFD8 mov dword ptr [ebp-14h],0 |
결론 |
어셈블리 코드와 다수의 반복을 해보면 int -> int 가 가장 빠르고 다른 방법의 복사가 느림을 알 수 있습니다.
따라서 메모리를 절약 또는 편의성을 위해서 byte , short 형을 사용하는 것은 오히려 프로그램을 느리게 함을 알 수 있음을 기억하도록 합시다.
하지만 용량을 중요하게 여기는 서버의 경우, 네트워크 전송이나 용량을 고려하여 절충하여 사용해야 합니다.