物理时候我测量这样的两个事件之间的物理时间:逻辑时间与在Ubuntu Linux操作系统
#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 ..并且“逻辑”(用clock()测量)将为0.27,对于较小的测量,它将舍入到零,这导致第二个问题......)
2)由此产生的时间似乎比通过gettimeofday返回一个更粗糙
有没有更好的方法来衡量本地线程时间在Linux?
似乎这种解决方案也不完整;显然,从一段时间以来,rusage的结果不会有新的价值(我的猜测是,直到下一次上下文交换重新输入时才会获得新的值)。如果这个假设是有效的,那就意味着每次逻辑时间改变时都必须实施一个hackaround,存储物理时间,那么只要报告的逻辑时间没有改变,就必须添加自上次改变以来的物理时间增量。并且这可能既不是完全准确的,因为我不知道在上次上下文交换之前有多远。把时间带到linux邮件列表 – lurscher 2010-10-26 18:31:59
我也尝试过'clock_gettime',结果是'getrusage'的结果和'gettimeofday'的结果之间的中间值,并且由于我们最终是在一个可靠的基准测量之后,我不相信任何选择都比另一个更好... http://www.guyrutenberg.com/2007/09/22/profiling-code-using-clock_gettime/ – lurscher 2010-10-30 21:37:27