
Q1.파란색 저 부분(large_integer)은 저게 자료형을 나타내는 건지? 구조체를 나타내는 건지?
LARGE_INTEGER은 Windows.h 헤더 파일에 정의된 구조체입니다.
구조체란 데이터를 하나의 단위로 묶어서 사용하는 것을 의미하고 64비트 값(아주 큰 값이겠죵?)을 저장하기 위해 설계되었습니다. 시간 측정은 정밀해야하고 기본정수나 실수 변수만으로는 정밀한 시간 측정값이나 큰 카운터 값들을 다루기 힘들기 때문에 위와 같은 큰 정수값을 다룰 수 있는 구조체가 필요한 것입니다.
Q2.Queryperformancecounter(초록)에 주소를 넣은 건데 왜 시간을 알 수 있는 지?
일단 카운터의 원리를 알아야 합니다. 카운터는 시스템이 시작될 때부터 계속 증가해야하는 값입니다.(물론 컴퓨터마다 증가 속도는 다를 수 있음) 예를 들어 카운터값이 1초에 100번 증가한다고 가정해봅시다. 반대로 카운터의 값이 100만큼 증가했다면 실제로 1초가 지났다고 볼 수 있겠죠?
이 함수는 "이 시점에서 카운터가 어떤 값인지" 알려주는 역할을 합니다.그래서 이 함수를 호출할 때마다 현재의 카운터 값을 받을 수 있습니다. 물론 그렇기 때문에 몇 초가 지났는 지도 알 수 있는 겁니다.
--->주소를 넣었는 데 왜 시간을 알 수 있냐면..
함수를 사용할 때 카운터 값을 어딘가에 저장해야겠죠? 그래서 함수에 변수의 주소(위치)를 넘겨주면 함수는 그 주소에 있는 변수에 현재의 카운터 값을 저장합니다.
EX)
LARGE_INTEGER start;
QueryPerformanceCounter(&start);
이 코드는 start 변수에 현재 카운터 값을 저장하게 됩니다. (&start는 start 변수의 주소임) start와 end라는 두 변수에 두 시점의 카운터 값을 저장하면, 그 사이에 얼마나 많은 카운터 값이 증가했는지 알 수 있고, 그것을 실제 시간(초)으로 바꾸기 위해서는 QueryPerformanceFrequency를 사용해야 합니다.
Q3.노란색은 시간을 알수있게 하기 위한 과정인 거 알겠는 데 그 전에 초록색 부분은 왜 적어야 하는 건지?
컴퓨터마다 카운터의 증가 속도는 다를 수 있기 때문에 QueryPerformanceCounter(노란색)로 얻은 숫자가 '얼마나 빨리' 증가하는지 알아야 실제 시간을 알 수 있습니다. 그래서 이 숫자가 1초에 몇 번 증가하는 지 알려주는 것이 QueryPerformanceFrequency(초록색)입니다.
만약 QueryPerformanceFrequency가 2,000,000(이십만)이라고 알려줬다면, QueryPerformanceCounter의 값이 2,000,000만큼 증가하면 1초가 지났다는 것을 알 수 있습니다.
EX)
LARGE_INTEGER ticksPerSec;
QueryPerformanceFrequency(&ticksPerSec);
이 코드는 ticksPerSec 변수에 1초에 QueryPerformanceCounter가 얼마나 빠르게 증가하는지 값을 저장합니다. 그래서 이 값을 이용하면 QueryPerformanceCounter로부터 실제 시간을 계산할 수 있게 되는 것이죠.

<전체 코드 설명>
1. ticksPerSec, start, end, diff 변수들을 LARGE_INTEGER 구조체로 선언.
2. QueryPerformanceFrequency 함수 호출해서 1초 동안 카운터가 몇 번 증가하는지 ticksPerSec에 저장.
3. QueryPerformanceCounter 함수를 호출하여 작업 시작 전의 카운터 값을 start에 저장함.
시간을 측정하고 싶은 작업을 넣는 공간이 있음. 현재는 비어 있음. (주석 부분에 코드가 들어가야함)
작업이 끝난 후에 QueryPerformanceCounter 함수를 다시 호출해서 작업 완료 후의 카운터 값을 end에 저장함.
4. end에서 start 값을 빼면 실제 작업에 걸린 카운터의 증가량이 나오겠지? 그게 diff 값이고 ticksPerSec로 나눠서 실제 시간(초)을 계산하고 출력함. 앞에 설명한거처럼 ticksPerSec는 1초에 그 숫자가 몇 번 증가하는지 알려주겠지? 그래서 diff를 ticksPerSec로 나누면, 실제로 얼마나 많은 초(시간)가 걸렸는지 알 수 있음.
이렇게 전체 코드는 특정 작업의 실행 시간을 초 단위로 측정할 수 있게 해주는 것입니다.