이 글에서는 리눅스 환경에서 C++를 사용해 프로그램의 경과 시간 등 다양한 시간을 밀리초 단위로 구하는 방법을 알아보겠습니다.
timeval 구조체와 gettimeofday 함수
리눅스에서는 <sys/time.h> 헤더 파일에 정의된 timeval 구조체를 활용할 수 있습니다. 이 구조체는 시간을 초(tv_sec)와 마이크로초(tv_usec) 단위로 저장하며, gettimeofday() 함수를 호출하면 현재 시각을 손쉽게 얻을 수 있습니다.
측정 원리는 간단합니다. 코드 실행 전에 시작 시간을 기록하고, 실행이 끝난 후 종료 시간을 기록한 뒤 두 값의 차이를 계산하면 됩니다.
예제 코드
#include <sys/time.h>
#include <iostream>
#include <unistd.h>
using namespace std;
main() {
struct timeval start_time, end_time;
long milli_time, seconds, useconds;
gettimeofday(&start_time, NULL);
cout << "Enter something: ";
char ch;
cin >> ch;
gettimeofday(&end_time, NULL);
seconds = end_time.tv_sec - start_time.tv_sec; // 초 단위 차이
useconds = end_time.tv_usec - start_time.tv_usec; // 마이크로초 단위 차이
milli_time = ((seconds) * 1000 + useconds/1000.0); // 밀리초로 변환
cout << "Elapsed time: " << milli_time <<" milliseconds\n";
}실행 결과
Enter something: h Elapsed time: 2476 milliseconds
코드 설명
gettimeofday(&start_time, NULL): 사용자 입력을 받기 전에 현재 시각을 시작 시간으로 기록합니다.seconds: 종료 시간과 시작 시간의 초(tv_sec) 차이를 계산합니다.useconds: 마이크로초(tv_usec) 부분의 차이를 계산합니다.milli_time: 초 단위 차이에 1000을 곱하고, 마이크로초 차이를 1000으로 나누어 최종적으로 밀리초 단위 경과 시간을 구합니다.
참고: C++11 이상이라면 std::chrono 활용
C++11부터는 표준 라이브러리인 <chrono>를 사용하는 것이 더 권장됩니다. 플랫폼에 종속되지 않아 리눅스뿐 아니라 윈도우, macOS 등 어디서든 동일하게 동작하며 타입 안정성도 뛰어납니다.
#include <chrono>
#include <iostream>
using namespace std;
using namespace chrono;
int main() {
auto start = steady_clock::now();
char ch;
cout << "Enter something: ";
cin >> ch;
auto end = steady_clock::now();
auto ms = duration_cast<milliseconds>(end - start).count();
cout << "Elapsed time: " << ms << " milliseconds\n";
}정리하면, 리눅스 전용으로 빠르게 구현할 때는 gettimeofday() 방식이 유용하고, 이식성과 현대적인 C++ 스타일을 중시한다면 std::chrono를 사용하는 것이 좋습니다.