我正在测量两个事件之间的物理时间:
#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中的本地线程时间?
答案 0 :(得分:3)
您可以使用一些更高精度的选项 - 请查看sys/timex.h
。另外,例如,Boost Date.Time具有毫秒级和更高级别的精度计时器。
至于'总时间&gt;物理经过的时间',我确实看到了多线程计时。这只是一个'会计'的东西:所有cpu'消费'都被添加,如果所有线程都能正常工作,那么多线程代码中的所有cpu'消耗'可能会超过经过的时间,一些调度开销会被添加,并且你有超过经过的时间。
答案 1 :(得分:2)
tv_usec
的{{1}}字段以微秒为单位,而不是以struct timeval
为单位。
答案 2 :(得分:0)
好的经过一些研究后我发现getrusage满足了所提到的两个需求:
所以基本上所需的代码与我用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( ¶mStruct);
processed_time0 = paramStruct.ru_utime;
...stuff happening
// end of period measurement
int result = getrusage( ¶mStruct );
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,但在文档中没有提到过程或用户与系统时间,我认为图书馆只关心测量物理时间