마이크로세컨드 단위의 타이머를 C로 코딩하기

고레벨 언어로 타이머를 코딩하기는 쉽다. 자바를 사용할 경우 내장된 System.currentTimeMillis() 함수를 사용하면 된다. 허나 입력 크기가 큰 알고리즘의 계산 시간을 최적화하기 위해 C언어를 사용해야 할 경우가 많다.

C언어의 내장된 타이머는 1초 단위로 시간을 기록하기에 UNIX 시스템을 위한 sys/time.h 라이브러리를 사용해야 한다. (나는 윈도우 PC에서 WSL을 사용하고 있다.) gettimeofday(struct timeval *, void *) 함수는 현재 시간을 마이크로세컨드 단위의 timeval이라는 구조체로 저장한다.

timeval 구조체는 time_t tv_seclong tv_usec 두개의 멤버를 지니고 있다. 전자는 UNIX Timestamp (1970년 1월 1일 00:00:00으로부터 지난 초)를 저장하고, 후자는 현 시간의 소숫점 뒷부분을 마이크로세컨드 단위로 저장한다.

long timediff(struct timeval* start, struct timeval* stop) {
	long start_ms = (long) start->tv_sec * (long) 1000000 + start->tv_usec;
	long stop_ms = (long) stop->tv_sec * (long) 1000000 + stop->tv_usec;
	return stop_ms - start_ms;
}

위 코드는 start부터 stop까지 흐른 시간을 마이크로세컨드 단위로 계산한다. time_t라는 데이터 유형을 지닌 tv_sec를 알맞는 long 데이터 유형으로 변환하고, 밀리세컨드로 나타내기 위해 1000000을 곱한다는 것에 주의하자.

이 함수를 사용해보자.

int main() {
	gettimeofday(&start, NULL);
	// 무언가를 하세요
	gettimeofday(&stop, NULL);
	printf("%ld microseconds\n", n, timediff(&start, &stop));
}

longprintf로 출력하려면 %ld을 사용해야 한다는 점을 기억하자.

C언어로 런타임 분석을 하러 가자!

#코딩 #c언어 #컴싸