C에서 함수 실행 시간 측정하기
프로그램이나 특정 프로세스가 실행되는 데 걸리는 시간을 계산해야 하는 경우가 자주 있습니다. C 언어에서는 clock() 함수를 사용하여 이를 간단하게 측정할 수 있습니다. clock() 함수는 표준 헤더 파일인 time.h에 정의되어 있으며, 프로그램 시작 이후 경과된 프로세서 시간(클록 틱 수)을 반환합니다.
경과 시간을 구하는 원리는 다음과 같습니다. 작업을 수행하기 직전에 clock()으로 시작 시점의 값을 저장하고, 작업이 끝난 후 다시 clock()을 호출하여 두 값의 차이를 구합니다. 그다음 이 차이를 CLOCKS_PER_SEC(초당 클록 틱 수)로 나누면 실제 소요된 시간을 초 단위로 얻을 수 있습니다.
측정 절차 요약
1. 코드 실행 전 clock() 함수를 호출하여 시작 시간을 기록합니다.
2. 측정하려는 작업 또는 함수를 실행합니다.
3. 작업 종료 후 다시 clock()을 호출하고, 시작 시간을 빼서 차이를 계산합니다.
4. 그 결과를 CLOCKS_PER_SEC로 나누어 초 단위의 경과 시간을 구합니다.
예제 코드
아래 예제는 사용자가 Enter 키를 누를 때까지 카운터가 동작하며, take_enter() 함수가 실행되는 데 걸린 시간을 측정합니다.
#include <stdio.h>
#include <time.h>
void take_enter() {
printf("Press enter to stop the counter \n");
while(1) {
if (getchar())
break;
}
}
int main() {
// take_enter() 함수의 실행 시간을 계산합니다.
clock_t t;
t = clock();
printf("Timer starts\n");
take_enter();
printf("Timer ends \n");
t = clock() - t; // 시작 시간을 빼서 경과 시간(틱)을 구함
double time_taken = ((double)t)/CLOCKS_PER_SEC; // 초 단위로 변환
printf("The program took %f seconds to execute", time_taken);
}실행 결과
Timer starts Press enter to stop the counter Timer ends The program took 5.218000 seconds to execute
참고 사항
clock() 함수가 반환하는 값은 실제 벽시계(wall-clock) 시간이 아니라 CPU가 해당 프로그램을 처리하는 데 사용한 프로세서 시간이라는 점에 유의해야 합니다. 따라서 입출력 대기처럼 CPU가 유휴 상태인 시간은 포함되지 않을 수 있으며, 멀티스레드 환경에서는 스레드별 CPU 시간이 합산될 수도 있습니다. 벽시계 기준의 실제 경과 시간이 필요하다면 POSIX 환경에서는 clock_gettime(), Windows 환경에서는 QueryPerformanceCounter() 같은 고해상도 타이머 API를 사용하는 것이 좋습니다.