2011-12-29 3 views
1

2 개의 gettimeofday 인스턴스를 뺀 다음 밀리 초 단위로 응답을 표시하려고합니다.gettimeofday 인스턴스 두 개를 빼는 방법은 무엇입니까?

아이디어는 다음과 같습니다

static struct timeval tv; 
    gettimeofday(&tv, NULL); 

    static struct timeval tv2; 
    gettimeofday(&tv2, NULL); 

    static struct timeval tv3=tv2-tv; 

다음 밀리 초 해상도로 'TV3'을 변환합니다.

+0

직접 알아낼 수 없습니까? : 필드를 필드로 빼고,'tv_usec'가 음수이면 결과를 정규화하십시오! –

+0

나는 'if'문장을 사용하는 대신에 더 좋은 방법이 있다고 생각했다. – user1106106

답변

6

glibc에서 제공하는 timersub() 함수를 사용하여 결과를 밀리 초 단위로 변환 할 수 있습니다 (단,이 경우 오버플로가 발생하지 않도록주의하십시오!).

+0

오버플로가 발생해야하는 이유는 무엇입니까? – user1106106

+0

@ user1106106 : 빼기 두 값이 "XXX_MAX"밀리 초 간격을 초과하면 밀리 초로 변환 된 결과가 "xxx"유형의 단일 변수에 맞지 않습니다. – janneb

3

여기

struct timeval tv; 
gettimeofday(&tv, NULL); 
// ... 
struct timeval tv2; 
gettimeofday(&tv2, NULL); 

int microseconds = (tv2.tv_sec - tv.tv_sec) * 1000000 + ((int)tv2.tv_usec - (int)tv.tv_usec); 
int milliseconds = microseconds/1000; 
struct timeval tv3; 
tv3.tv_sec = microseconds/1000000; 
tv3.tv_usec = microseconds%1000000; 

(timersub 다른 곳에서 제공하는 표준 기능이 아니므로) 수동으로 작업을 수행하는 방법 (그리고 당신은 더 악화 만드는, 오버 플로우에 대한보고가)

현재를 C++의 버전은 더 나은 옵션을 제공합니다.

#include <chrono> // new time utilities 

// new type alias syntax 
using Clock = std::chrono::high_resolution_clock; 
// the above is the same as "typedef std::chrono::high_resolution_clock Clock;" 
// but easier to read and the syntax supports being templated 
using Time_point = Clock::time_point; 

Time_point tp = Clock::now(); 
// ... 
Time_point tp2 = Clock::now(); 

using std::chrono::milliseconds; 
using std::chrono::duration_cast; 
std::cout << duration_cast<milliseconds>(tp2 - tp).count() << '\n'; 
+0

woops. 당신이 올바른지. 나는 그것이 tm 구조체와 섞이게되었다. 내 의견을 삭제하겠습니다. – Octopus

관련 문제