ubuntu linux中的逻辑时间与物理时间

时间:2010-10-25 15:08:04

标签: linux time timer gettimeofday time-measurement

我正在测量两个事件之间的物理时间:

#include <time.h>
#include <sys/time.h>

timeval wall_time0;
timeval wall_time1;

// start of period measurement
gettimeofday( &wall_time0 , 0);

...stuff happening 

// end of period measurement
gettimeofday( &wall_time1 , 0);

return ( ( wall_time1.tv_sec - wall_time0.tv_sec ) + (( wall_time1.tv_usec - wall_time0.tv_usec )/(double)1000000) );

但是现在,我需要一种方法来衡量线程实际使用的逻辑时间。也就是说,理论上应该是物理时间,减少运行其他线程和/或系统所花费的时间。内核逻辑。

想到这是做到这一点的方法:

clock_t mTime0;
clock_t mTime1;

//start of period measurement
mTime0=clock();

... stuff happening


//end of period measurement
mTime1=clock();
return (mTime1-mTime0)/(double)CLOCKS_PER_SEC;

但做了一些测量,我发现了两个问题:

1)对于某些测量,它大于物理时间,这是不对的(即:对于某个循环,物理时间将是0.2495 ..和“逻辑”(用时钟()测量)将是0.27,对于较小的测量,它将向上舍入到零,这导致第二个问题......)

2)结果时间似乎比gettimeofday返回的时间更粗糙

有没有更好的方法来测量linux中的本地线程时间?

3 个答案:

答案 0 :(得分:3)

您可以使用一些更高精度的选项 - 请查看sys/timex.h。另外,例如,Boost Date.Time具有毫秒级和更高级别的精度计时器。

至于'总时间&gt;物理经过的时间',我确实看到了多线程计时。这只是一个'会计'的东西:所有cpu'消费'都被添加,如果所有线程都能正常工作,那么多线程代码中的所有cpu'消耗'可能会超过经过的时间,一些调度开销会被添加,并且你有超过经过的时间。

答案 1 :(得分:2)

tv_usec的{​​{1}}字段以微秒为单位,而不是以struct timeval为单位。

答案 2 :(得分:0)

好的经过一些研究后我发现getrusage满足了所提到的两个需求:

getrusage man page

所以基本上所需的代码与我用gettimeofday测量物理时间的方式非常相似,只是现在我使用getrusage

#include <time.h>
#include <sys/time.h>
#include <sys/resource.h>

timeval processed_time0;
timeval processed_time1;
rusage paramStruct
// start of period measurement
int result = getrusage( &paramStruct);
processed_time0 = paramStruct.ru_utime;

...stuff happening 

// end of period measurement
int result = getrusage( &paramStruct );
processed_time1 = paramStruct.ru_utime;

return ( ( processed_time1.tv_sec - processed_time0.tv_sec ) + (( processed_time1.tv_usec - processed_time0.tv_usec )/(double)1000000) );
这种方式给了我两个

1)当前流程消耗时间

2)微秒分辨率

我调查了Boost Date.Time,但在文档中没有提到过程或用户与系统时间,我认为图书馆只关心测量物理时间