MacOS에서는 CLOCKS_PER_SEC가 1,000,000으로 나눠집니다!!

DANO PARK·2022년 8월 10일
0

에러/해결

목록 보기
5/5
post-thumbnail

어쩌다보니 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()로 경과시간 구하기

구글링 끝에 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 보정타입(일광 절약시간)
}

끝.


참고 : https://www.joinc.co.kr/w/man/2/gettimeofday

profile
단오해서 단호박!

0개의 댓글