본문 바로가기

S-DEV/C언어 마스터....

Windows C 최적화

728x90

• 최적화

컴파일러 최적화 기능은 소스코드를 기계어로 변환할 때 코드를 더 빠르게 실행하고 메모리를 효율적으로 사용하기 위함이다.

 

- 코드 최적화 /O 옵션 ⇒ 최대 속도 또는 최소 크기에 대한 코드를 만드는데 도움이 되는 옵션이다.

Visual Studio 최적화

여러 옵션들이 있지만, Visual Studio 프로그램에서 할 수 있는 최적화 옵션에 대해서만 작성을 하였다.

> /Od 옵션은 최적화를 사용하지 않도록 설정하여 컴파일 속도를 조정하고 디버깅을 간소화한다.

> /O1  옵션은 최소 크기 코드를 생성하는 최적화의 조합을 설정한다.

> /O2 옵션은 최대 속도를 위해 코드를 최적화하는 최적화의 조합을 설정한다.

> /Ox 옵션은 속도에 중점을 둔 여러 최적화를 선택하는 조합 옵션이다. 

 

• 최적화 예시 코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

/*
    Windows C 최적화 로직 예시 작성
*/

void sum(int* num1, int* num2, int* result) {
    for (int i = 0; i < 6; i++) {
        result[i] = num1[i] + num2[i];
    }
}

int main() {
    int num1[6] = { 1, 2, 3, 4, 5, 6 };
    int num2[6] = { 6, 7, 8, 9, 10, 11 };
    int result[6] = { 0 };

    sum(num1, num2, result);

    for (int i = 0; i < 6; i++) {
        printf("%d\n", result[i]);
    }

    return 0;
}

 

• 최적화를 사용하지 않은 디버깅 간소화 (/Od 옵션)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

/*
    Windows C 최적화 로직 예시 작성
*/

void sum(int* num1, int* num2, int* result) {
00007FF759351AE0  mov         qword ptr [rsp+18h],r8  
00007FF759351AE5  mov         qword ptr [rsp+10h],rdx  
00007FF759351AEA  mov         qword ptr [rsp+8],rcx  
00007FF759351AEF  push        rbp  
00007FF759351AF0  push        rdi  
00007FF759351AF1  sub         rsp,108h  
00007FF759351AF8  lea         rbp,[rsp+20h]  
00007FF759351AFD  lea         rcx,[__DB4B1920_Project1@c (07FF759362008h)]  
00007FF759351B04  call        __CheckForDebuggerJustMyCode (07FF759351370h)  
    for (int i = 0; i < 6; i++) {
00007FF759351B09  mov         dword ptr [rbp+4],0  
00007FF759351B10  jmp         sum+3Ah (07FF759351B1Ah)  
00007FF759351B12  mov         eax,dword ptr [rbp+4]  
00007FF759351B15  inc         eax  
00007FF759351B17  mov         dword ptr [rbp+4],eax  
00007FF759351B1A  cmp         dword ptr [rbp+4],6  
00007FF759351B1E  jge         sum+6Ch (07FF759351B4Ch)  
        result[i] = num1[i] + num2[i];
00007FF759351B20  movsxd      rax,dword ptr [rbp+4]  
00007FF759351B24  movsxd      rcx,dword ptr [rbp+4]  
00007FF759351B28  mov         rdx,qword ptr [num1]  
00007FF759351B2F  mov         eax,dword ptr [rdx+rax*4]  
00007FF759351B32  mov         rdx,qword ptr [num2]  
00007FF759351B39  add         eax,dword ptr [rdx+rcx*4]  
00007FF759351B3C  movsxd      rcx,dword ptr [rbp+4]  
00007FF759351B40  mov         rdx,qword ptr [result]  
00007FF759351B47  mov         dword ptr [rdx+rcx*4],eax  
    }
00007FF759351B4A  jmp         sum+32h (07FF759351B12h)  
}
00007FF759351B4C  lea         rsp,[rbp+0E8h]  
00007FF759351B53  pop         rdi  
00007FF759351B54  pop         rbp  
00007FF759351B55  ret

 

• 크기 우선 최적화 (/O1) 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

/*
    Windows C 최적화 로직 예시 작성
*/

void sum(int* num1, int* num2, int* result) {
00007FF78ED22C40  mov         qword ptr [rsp+8],rbx  
00007FF78ED22C45  mov         qword ptr [rsp+10h],rsi  
00007FF78ED22C4A  push        rdi  
00007FF78ED22C4B  sub         rsp,20h  
00007FF78ED22C4F  mov         rsi,rcx  
00007FF78ED22C52  mov         rdi,r8  
00007FF78ED22C55  lea         rcx,[__DB4B1920_Project1@c (07FF78ED32008h)]  
00007FF78ED22C5C  mov         rbx,rdx  
00007FF78ED22C5F  call        __CheckForDebuggerJustMyCode (07FF78ED21370h)  
00007FF78ED22C64  sub         rsi,rbx  
00007FF78ED22C67  mov         edx,6  
00007FF78ED22C6C  sub         rdi,rbx  
    for (int i = 0; i < 6; i++) {
        result[i] = num1[i] + num2[i];
00007FF78ED22C6F  mov         eax,dword ptr [rsi+rbx]  
00007FF78ED22C72  add         eax,dword ptr [rbx]  
00007FF78ED22C74  mov         dword ptr [rdi+rbx],eax  
00007FF78ED22C77  lea         rbx,[rbx+4]  
00007FF78ED22C7B  sub         rdx,1  
00007FF78ED22C7F  jne         sum+2Fh (07FF78ED22C6Fh)  
    }
}
00007FF78ED22C81  mov         rbx,qword ptr [rsp+30h]  
00007FF78ED22C86  mov         rsi,qword ptr [rsp+38h]  
00007FF78ED22C8B  add         rsp,20h  
00007FF78ED22C8F  pop         rdi  
00007FF78ED22C90  ret

 

• 최대속도 최적화 (/O2) 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

/*
    Windows C 최적화 로직 예시 작성
*/

void sum(int* num1, int* num2, int* result) {
00007FF7851E19C0  mov         qword ptr [rsp+8],rbx  
00007FF7851E19C5  mov         qword ptr [rsp+10h],rsi  
00007FF7851E19CA  push        rdi  
00007FF7851E19CB  sub         rsp,20h  
00007FF7851E19CF  mov         rbx,rcx  
00007FF7851E19D2  mov         rsi,r8  
00007FF7851E19D5  lea         rcx,[__DB4B1920_Project1@c (07FF7851F2008h)]  
00007FF7851E19DC  mov         rdi,rdx  
00007FF7851E19DF  call        __CheckForDebuggerJustMyCode (07FF7851E1370h)  
00007FF7851E19E4  mov         eax,dword ptr [rbx]  
00007FF7851E19E6  add         eax,dword ptr [rdi]  
00007FF7851E19E8  mov         dword ptr [rsi],eax  
00007FF7851E19EA  mov         eax,dword ptr [rbx+4]  
00007FF7851E19ED  add         eax,dword ptr [rdi+4]  
00007FF7851E19F0  mov         dword ptr [rsi+4],eax  
00007FF7851E19F3  mov         eax,dword ptr [rbx+8]  
00007FF7851E19F6  add         eax,dword ptr [rdi+8]  
00007FF7851E19F9  mov         dword ptr [rsi+8],eax  
00007FF7851E19FC  mov         eax,dword ptr [rbx+0Ch]  
00007FF7851E19FF  add         eax,dword ptr [rdi+0Ch]  
00007FF7851E1A02  mov         dword ptr [rsi+0Ch],eax  
00007FF7851E1A05  mov         eax,dword ptr [rbx+10h]  
00007FF7851E1A08  add         eax,dword ptr [rdi+10h]  
00007FF7851E1A0B  mov         dword ptr [rsi+10h],eax  
00007FF7851E1A0E  mov         eax,dword ptr [rbx+14h]  
00007FF7851E1A11  add         eax,dword ptr [rdi+14h]  
00007FF7851E1A14  mov         rbx,qword ptr [rsp+30h]  
00007FF7851E1A19  mov         dword ptr [rsi+14h],eax  
00007FF7851E1A1C  mov         rsi,qword ptr [rsp+38h]  
    for (int i = 0; i < 6; i++) {
        result[i] = num1[i] + num2[i];
    }
}
00007FF7851E1A21  add         rsp,20h  
00007FF7851E1A25  pop         rdi  
00007FF7851E1A26  ret

 

• /Ox 속도에 중점을 둔 여러 최적화를 선택하는 조합

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

/*
    Windows C 최적화 로직 예시 작성
*/

void sum(int* num1, int* num2, int* result) {
00007FF6A50C19C0  mov         qword ptr [rsp+8],rbx  
00007FF6A50C19C5  mov         qword ptr [rsp+10h],rsi  
00007FF6A50C19CA  push        rdi  
00007FF6A50C19CB  sub         rsp,20h  
00007FF6A50C19CF  mov         rbx,rcx  
00007FF6A50C19D2  mov         rsi,r8  
00007FF6A50C19D5  lea         rcx,[__DB4B1920_Project1@c (07FF6A50D2008h)]  
00007FF6A50C19DC  mov         rdi,rdx  
00007FF6A50C19DF  call        __CheckForDebuggerJustMyCode (07FF6A50C1370h)  
00007FF6A50C19E4  mov         eax,dword ptr [rbx]  
00007FF6A50C19E6  add         eax,dword ptr [rdi]  
00007FF6A50C19E8  mov         dword ptr [rsi],eax  
00007FF6A50C19EA  mov         eax,dword ptr [rbx+4]  
00007FF6A50C19ED  add         eax,dword ptr [rdi+4]  
00007FF6A50C19F0  mov         dword ptr [rsi+4],eax  
00007FF6A50C19F3  mov         eax,dword ptr [rbx+8]  
00007FF6A50C19F6  add         eax,dword ptr [rdi+8]  
00007FF6A50C19F9  mov         dword ptr [rsi+8],eax  
00007FF6A50C19FC  mov         eax,dword ptr [rbx+0Ch]  
00007FF6A50C19FF  add         eax,dword ptr [rdi+0Ch]  
00007FF6A50C1A02  mov         dword ptr [rsi+0Ch],eax  
00007FF6A50C1A05  mov         eax,dword ptr [rbx+10h]  
00007FF6A50C1A08  add         eax,dword ptr [rdi+10h]  
00007FF6A50C1A0B  mov         dword ptr [rsi+10h],eax  
00007FF6A50C1A0E  mov         eax,dword ptr [rbx+14h]  
00007FF6A50C1A11  add         eax,dword ptr [rdi+14h]  
00007FF6A50C1A14  mov         rbx,qword ptr [rsp+30h]  
00007FF6A50C1A19  mov         dword ptr [rsi+14h],eax  
00007FF6A50C1A1C  mov         rsi,qword ptr [rsp+38h]  
    for (int i = 0; i < 6; i++) {
        result[i] = num1[i] + num2[i];
    }
}
00007FF6A50C1A21  add         rsp,20h  
00007FF6A50C1A25  pop         rdi  
00007FF6A50C1A26  ret

'S-DEV > C언어 마스터....' 카테고리의 다른 글

Socket  (0) 2023.07.27
정규 표현식 구현 코드  (0) 2023.07.27
strcpy 구현  (0) 2023.07.19
int 배열과 char 배열의 차이점  (0) 2023.07.19
C언어 기록  (0) 2023.07.03