어쩌다보니 C언어도 공부하기 시작한 나...
C언어를 독학하는데 있어서 가장 큰 문제는 C언어 강의나 서적들이 Window 운영체제를 기반으로 설명해준다는 것이다. 나는 맥북쓰는데... MacOS에서 알려주는 그런 강의없습니까... 서로 다른 운영체제를 쓰다보니, Window에서 사용가능한 코드가 MacOS에서는 작동하지 않는 경우가 종종 있다. 오늘이 그러했다...
왜 MacOS론 햄보칼수업써!!
문제는 C언어로 경과시간을 구하면서부터 시작되었다. 특정 동작이 일어난 후 시작 시간에서부터 경과시간을 구하는 코드는 대충 아래와 같다.
#include <stdio.h>
#include <time.h>
int main(void) {
long startTime = 0;
long elapsedTime = 0;
startTime = clock();
/* ~~~ 특정 동작 실행 중 ~~~ */
elapsedTime = (clock() - startTime) / CLOCKS_PER_SEC;
printf("경과 시간 : %ld초\n", elapsedTime);
return 0;
}
먼저 clock()
을 사용해서 처음 시작 시간 값과 동작 종료 후 시간 값을 각각 구한다. 이후, 동작 종료 후 시간에 처음 시작 시간을 뺀 뒤 CLOCKS_PER_SEC
로 나눠주면 초 단위로 값이 나오게 된다. 문제는 CLOCKS_PER_SEC
이 Window에서는 1,000을 의미하지만, MacOS에서는 1,000,000을 의미한다. 즉 같은 코드지만, MacOS에서는 Window에서 출력된 경과시간과 같은 값을 얻기 위해 훨씬 더 긴 영겁의 시간(?)을 견뎌야 한다는 것.
구글링 끝에 gettimeofday()
로 경과시간을 구하는 방법을 습득했다. 코드는 아래와 같다.
#include <stdio.h>
#include <sys/time.h>
int main(void) {
struct timeval startTime;
struct timeval endTime;
int elapsedTime;
gettimeofday(&startTime, NULL);
/* ~~~ 특정 동작 실행 중 ~~~ */
gettimeofday(&endTime, NULL);
elapsedTime = endTime.tv_sec - startTime.tv_sec;
printf("경과 시간 : %d", elapsedTime);
return 0;
}
clock()
을 사용했을때와 비슷한 구조다. gettimeofday()
는 아래와 같이 두개의 인자를 갖는다. 첫번째 인자 tv
는 현재 시스템 시간을 저장하기 위한 구조체, 두번째 인자 tz
은 타임존을 설정하기 위해서 사용된다. 현재 tz
는 사용하지 않기 때문에 NULL
을 사용하면 된다.
#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);
// tv
struct timeval
{
long tv_sec; // 초
long tv_usec; // 마이크로초
}
// tz
struct timezone
{
int tz_minuteswest: // 그리니치 서측분차
int tz_dsttime // DST 보정타입(일광 절약시간)
}
끝.