728x90
• 최적화
컴파일러 최적화 기능은 소스코드를 기계어로 변환할 때 코드를 더 빠르게 실행하고 메모리를 효율적으로 사용하기 위함이다.
- 코드 최적화 /O 옵션 ⇒ 최대 속도 또는 최소 크기에 대한 코드를 만드는데 도움이 되는 옵션이다.
여러 옵션들이 있지만, 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 |