Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ubuntu linux中的逻辑时间与物理时间_Linux_Time_Timer_Gettimeofday_Time Measurement - Fatal编程技术网

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

ubuntu linux中的逻辑时间与物理时间,linux,time,timer,gettimeofday,time-measurement,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( &a

我在测量两个事件之间的物理时间,如下所示:

#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) );
但在进行一些测量时,我注意到两个问题:

1) 对于某些测量,它比物理时间大,这是不正确的(即:对于某些循环,物理时间将为0.2495...“逻辑”(用clock()测量)将为0.27,对于较小的测量,它只会四舍五入到零,这导致第二个问题…)

2) 由此产生的时间似乎比gettimeofday返回的时间要粗糙得多


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

有一些更高精度的选项可以使用——请看
sys/timex.h
。例如,时间有毫秒和更高精度的计时器


至于“总时间>物理运行时间”,我确实在多线程计时中看到了这一点。这只是一个简单的“会计”问题:所有cpu“消耗”都被添加,并且在多线程代码中很可能超过运行时间,如果所有线程都工作,那么一些调度开销就会被添加,并且会超过运行时间。

您可以使用一些更高精度的选项——请看
sys/timex.h
。例如,时间有毫秒和更高精度的计时器


至于“总时间>物理运行时间”,我确实在多线程计时中看到了这一点。这只是一个简单的“记帐”内容:所有cpu“消耗”都被添加,并且在多线程代码中很可能超过运行时间。如果所有线程都工作,那么一些调度开销就会被添加,并且会超过运行时间。
struct timeval
tv\u usec
字段以微秒为单位,不是以每秒
1/(双)时钟为单位
struct timeval
tv\u usec
字段是以微秒为单位的,不是以每秒
1/(双)时钟为单位的

好吧,经过一点研究,我发现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( &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) );
#包括
#包括
#包括
timeval已处理_time0;
timeval已处理_time1;
rusage参数结构
//期初测量
int result=getrusage(¶mStruct);
processed_time0=paramStruct.ru_utime;
…发生了什么事
//期末计量
int result=getrusage(¶mStruct);
processed_time1=paramStruct.ru_utime;
返回((已处理的_time1.tv_sec-已处理的_time0.tv_sec)+((已处理的_time1.tv_usec-已处理的_time0.tv_usec)/(加倍)1000000));
这条路让我两全其美

1) 当前进程消耗的时间

2) 微秒分辨率


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

好的,经过一番研究,我发现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( &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) );
#包括
#包括
#包括
timeval已处理_time0;
timeval已处理_time1;
rusage参数结构
//期初测量
int result=getrusage(¶mStruct);
processed_time0=paramStruct.ru_utime;
…发生了什么事
//期末计量
int result=getrusage(¶mStruct);
processed_time1=paramStruct.ru_utime;
返回((已处理的_time1.tv_sec-已处理的_time0.tv_sec)+((已处理的_time1.tv_usec-已处理的_time0.tv_usec)/(加倍)1000000));
这条路让我两全其美

1) 当前进程消耗的时间

2) 微秒分辨率


我调查了Boost Date.Time,但在文档中没有提到进程或用户与系统时间,我认为库只是关心测量物理时间,这很有趣,但是我使用的测试程序是单线程的。。。我想大概是这样。我目前只针对unittest cpp进行链接,因此可能库创建了一个线程,使用getrusage,我现在得到的进程时间始终低于物理时间-时钟结果看起来确实很奇怪是的,但在多任务操作系统上,其他一些事情正在发生,需要考虑。这难道不是“你的”时间和总时间之间的部分差异吗?有趣的是,我使用的测试程序是单线程的。。。我想大概是这样。我目前只针对unittest cpp进行链接,因此可能库创建了一个线程,使用getrusage,我现在得到的进程时间始终低于物理时间-时钟结果看起来确实很奇怪是的,但在多任务操作系统上,其他一些事情正在发生,需要考虑。这难道不是“你的”时间和总时间之间的差异的一部分吗?对!纯属偶然,我的时钟每秒等于10e6,因此结果似乎很好!纯属偶然,我的时钟每秒等于10e6,因此结果似乎很好,似乎这个解决方案也不完整;显然,rusage的结果在一段时间内不会有新的值(我的猜测是,在下一次上下文交换重入之前,它不会得到新的值)。如果该假设是有效的,则意味着必须实施一种变通方法,每次逻辑时间更改时存储物理时间,那么只要报告的逻辑时间没有更改,就必须添加自上次更改以来的物理时间增量。可能两者都不完全准确,因为我不知道距离上次上下文交换还有多远。我也尝试了
clock\u gettime
,结果介于
getrusage
gettimeofday
的结果之间,因为我们最终追求的是一个可靠的基准