<실험 코드>
#include "TestClass.h"
#include <Windows.h>
#include <time.h>
int main()
{
LARGE_INTEGER Second = {};
LARGE_INTEGER Start = {};
LARGE_INTEGER End = {};
int AWin = 0;
int BWin = 0;
for (int k = 0; k < 100; ++k)
{
QueryPerformanceFrequency(&Second);
QueryPerformanceCounter(&Start);
for (int i = 0; i < 10000000; ++i)
{
int j = i;
}
QueryPerformanceCounter(&End);
double Elapsed1 = (End.QuadPart - Start.QuadPart) / (double)Second.QuadPart;
std::cout << "* 변수를 매번 생성과 동시에 할당하는 데 걸린 시간:\t" << Elapsed1 << "초" << std::endl;
int j = 0;
QueryPerformanceCounter(&Start);
for (int i = 0; i < 10000000; ++i)
{
j = i;
}
QueryPerformanceCounter(&End);
double Elapsed2 = (End.QuadPart - Start.QuadPart) / (double)Second.QuadPart;
std::cout << "* 변수를 미리 할당하고 값만 붙여넣는데 걸린 시간:\t" << Elapsed2 << "초" << std::endl;
if (Elapsed1 - Elapsed2 > (double)0)
{
std::cout << "\t매번 생성과 동시에 값을 저장 승리" << std::endl;
++AWin;
}
else
{
std::cout << "\t미리 생성해놓고 값 저장 승리" << std::endl;
++BWin;
}
std::cout << std::endl;
}
std::cout << "* 매번 생성과 동시에 값을 저장 승리 횟수:\t" << AWin << std::endl;
std::cout << "* 미리 생성해놓고 값 저장 승리 횟수:\t\t" << BWin << std::endl;
return 0;
}
<결과>
* x86 1000회 시행결과
- 1000회씩 몇 번 반복해서 시행해 봤으나 거의 오차범위 내로 반반 나왔음
* x64 1000회 시행결과
- 마찬가지로 1000회씩 반복하여 했었을 때 1:9 정도의 비율이 나왔음
??? 아직 프린이라 이유를 잘 모르겠다.
for (int i = 0; i < 10000000; ++i)
00007FF767F4243C mov dword ptr [rbp+0C4h],0
00007FF767F42446 jmp __$EncStackInitStart+0C7h (07FF767F42456h)
00007FF767F42448 mov eax,dword ptr [rbp+0C4h]
00007FF767F4244E inc eax
00007FF767F42450 mov dword ptr [rbp+0C4h],eax
00007FF767F42456 cmp dword ptr [rbp+0C4h],989680h
00007FF767F42460 jge __$EncStackInitStart+0E1h (07FF767F42470h)
{
int j = i;
00007FF767F42462 mov eax,dword ptr [rbp+0C4h]
00007FF767F42468 mov dword ptr [rbp+0E4h],eax
}
00007FF767F4246E jmp __$EncStackInitStart+0B9h (07FF767F42448h)
QueryPerformanceCounter(&End);
▲ 전자 어셈블리 코드 10줄
for (int i = 0; i < 10000000; ++i)
00007FF767F424B3 mov dword ptr [rbp+144h],0
00007FF767F424BD jmp __$EncStackInitStart+13Eh (07FF767F424CDh)
00007FF767F424BF mov eax,dword ptr [rbp+144h]
00007FF767F424C5 inc eax
00007FF767F424C7 mov dword ptr [rbp+144h],eax
00007FF767F424CD cmp dword ptr [rbp+144h],989680h
00007FF767F424D7 jge __$EncStackInitStart+158h (07FF767F424E7h)
{
j = i;
00007FF767F424D9 mov eax,dword ptr [rbp+144h]
00007FF767F424DF mov dword ptr [rbp+124h],eax
}
00007FF767F424E5 jmp __$EncStackInitStart+130h (07FF767F424BFh)
▲ 후자도 마찬가지로 10줄
분명 어셈블리 코드 줄 수도 같은데...?
프로그래밍에 대한 소프트웨어적인 이해 뿐만 아니라 하드웨어적인 이해도 있어야 문제가 해결 가능할 듯 하다...
'자습' 카테고리의 다른 글
SharedPtr, Reference Counting 구현과 이해 (0) | 2022.05.08 |
---|---|
스택에 생성된 객체는 delete가 되지 않는다 (0) | 2022.05.07 |
부모 클래스의 소멸자에 가상함수를 쓰는 이유 (0) | 2022.04.27 |
실험실: 클래스의 소멸자에서 해당 클래스의 함수 호출이 가능한가? (0) | 2022.04.20 |
220413_자료구조_자동 확장 서클 큐(Circle Queue) (0) | 2022.04.18 |