본문 바로가기

Datastructure/[Objection]

시간 측정 함수

728x90
반응형

알고리즘의 실행시간을 측정하는 데는 점근적 분석 방법실제 시간 측정, 두 가지가 있다.

점근적 분석에 의한 시간 측정

점근적 분석에 의한 시간 측정은 big-Oh 값을 구하는 이론적 방식을 말하며, 실제 시간 측정은 알고리즘 실행에 소요되는 cputime을 측정하는 것을 말한다.

실제 시간 측정

라이브러리 함수를 이용하여 어떤 알고리즘 실행에 소요되는 실제 cputime을 측정한다.
  • 라이브러리 함수 가운데 일반적인 시간측정 함수인 clock()을 사용하면 시간이 정밀하게 나오지 않는 문제가 발생한다.
  • 대안으로 QueryPerformanceCounter() 함수를 사용하면 정밀한 시간을 출력할 수 있다. 구체적인 사용 방법은 다음과 같다.
  1. 헤더파일로 windows.h를 추가한 후,  LARGE_INTEGER 변수 선언한다.
  2. QueryPerformanceFrequency() 함수를 통해 타이머의 주파수를 변수에 저장한다.
  3. 시간을 측정하고 싶은 작업의 전후에 QueryPerformanceCounter()를 호출하고 그 반환값들을 이용하여 계산, 출력한다.
주의점: 맥북에서는 #include <Windows.h>를 사용할 수 없다!
#include <stdio.h>
#include <Windows.h>
int main(void){

	LARGE_INTEGER ticksPerSec; 
	LARGE_INTEGER start, end, diff;
    
	QueryPerformanceFrequency(&ticksPerSec); 
	QueryPerformanceCounter(&start);
	// 시간을 측정하고 싶은 작업(예: 함수 호출)을 이곳에 삽입 
    
	QueryPerformanceCounter(&end);
	// 측정값으로부터 실행시간 계산
	diff.QuadPart = end.QuadPart - start.QuadPart;
	printf("time: %.12f sec\n\n", ((double)diff.QuadPart/(double)ticksPerSec.QuadPart)); 
	return 0;
}

작동 원리

메인보드에 고해상도의 타이머가 존재하는데 이를 이용하여 특정 실행 시점들의 CPU 클럭수들을 얻어온 후 그 차이를 이용하여 작업 시간을 구한다. clock() 함수와 달리 1us 이하의 시간까지 측정한다.

QueryPerformanceFrequency() 타이머의 주파수(초당 진동수)를 얻는 함수
QueryPerformanceCounter()  타이머의 CPU 클럭수를 얻는 함수
  • 작업 전후의 클럭수 차를 주파수로 나누면 작업 시간(초, sec)을 구할 수 있다.
  • ms단위로 출력하기 위해선 결과 값에 1,000을 곱해주면 된다.

clock() 함수와 비교

  • clock()은 초당 1,000번의 측정을 통해 1ms의 시간을 측정할 수 있는 데 비해, QueryPerformanceCounter()는 초당 10,000,000번의 측정으로 0.1us의 시간까지 측정할 수 있다.
  • 초당 클럭수는 time.h를 헤더로 추가한 후 CLOCKS_PER_SEC을 출력하여 알 수 있고, 타이머의 주파수는 QueryPerformanceFrequency()를 통해 알 수 있다.

 

728x90
반응형

'Datastructure > [Objection]' 카테고리의 다른 글

연결리스트  (0) 2022.02.06
유클리드 호제법: 재귀  (0) 2022.01.14
Shift 함수 / 시간 계산  (0) 2022.01.10
문자열 처리함수  (0) 2022.01.08
진수 변환  (0) 2022.01.05
댓글