为什么gettimeofday()间隔偶尔会消极?

时间:2010-05-06 10:26:15

标签: c++ c linux timing gettimeofday

我有一个实验性的库,我试图测量它的性能。为此,我写了以下内容:

struct timeval begin;
gettimeofday(&begin, NULL);
{
    // Experiment!
}
struct timeval end;
gettimeofday(&end, NULL);

// Print the time it took!
std::cout << "Time: " << 100000 * (end.tv_sec - begin.tv_sec) + (end.tv_usec - begin.tv_usec) << std::endl;

偶尔,我的结果包括负面时间,其中一些是荒谬的。例如:

Time: 226762
Time: 220222
Time: 210883
Time: -688976

发生了什么事?

5 个答案:

答案 0 :(得分:7)

你有一个错字。更正了最后一行(注意0的数量):

std::cout << "Time: " << 1000000 * (end.tv_sec - begin.tv_sec) + (end.tv_usec - begin.tv_usec) << std::endl;

BTW,timersub是一种内置方法,用于获取两个时间段之间的差异。

答案 1 :(得分:3)

  

std :: cout&lt;&lt; “时间:”&lt;&lt; 100000 *(end.tv_sec - begin.tv_sec)+(end.tv_usec - begin.tv_usec)&lt;&lt;的std :: ENDL;

如上所述,每秒有1000000个usec,而不是100000。

更一般地说,您可能需要了解计算机上计时的不稳定性。 ntpd等进程可能会更改时钟时间,从而导致不正确的增量时间。您可能对POSIX工具感兴趣,例如timer_create

答案 2 :(得分:3)

posix实时库更适合测量高精度间隔。你真的不想知道当前的时间。你只想知道两点之间有多长时间。这就是单调时钟的用途。

struct timespec begin;
clock_gettime( CLOCK_MONOTONIC, &begin );
{
    // Experiment!
}
struct timespec end;
clock_gettime(CLOCK_MONOTONIC, &end );

// Print the time it took!
std::cout << "Time: " << double(end.tv_sec - begin.tv_sec) + (end.tv_nsec - begin.tv_nsec)/1000000000.0 << std::endl;

链接时,您需要添加-lrt

使用单调时钟有几个优点。它通常使用硬件定时器(Hz晶体或其他),因此它通常比gettimeofday()更快。即使ntpd或用户正在使用系统时间,也可以保证单调计时器不会倒退。

答案 3 :(得分:2)

你照顾了负值,但它仍然不正确。毫秒变量之间的差异是错误的,比如说我们的开始和结束时间分别为1.100s和2.051s。根据接受的答案,这将是1.049s的经过时间,这是不正确的。

下面的代码处理的情况是只有毫秒而不是秒的差异以及毫秒值溢出的情况。

if(end.tv_sec==begin.tv_sec)
printf("Total Time =%ldus\n",(end.tv_usec-begin.tv_usec));
else
printf("Total Time =%ldus\n",(end.tv_sec-begin.tv_sec-1)*1000000+(1000000-begin.tv_usec)+end.tv_usec);

答案 4 :(得分:-1)

DO

$ time ./proxy-application

下次