자습

변수)매번 생성과 동시에 값을 저장 vs 미리 생성해놓고 값 저장

hyrule 2022. 5. 3. 17:50

<실험 코드>

#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줄

 

분명 어셈블리 코드 줄 수도 같은데...?

 

프로그래밍에 대한 소프트웨어적인 이해 뿐만 아니라 하드웨어적인 이해도 있어야 문제가 해결 가능할 듯 하다...