我正在尝试使用此类来分析程序:
namespace smtx{
class CPerformance_clock
{
timespec t1;
timespec diff(timespec start, timespec end)
{
timespec temp;
if ((end.tv_nsec-start.tv_nsec)<0) {
temp.tv_sec = end.tv_sec-start.tv_sec-1;
temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
} else {
temp.tv_sec = end.tv_sec-start.tv_sec;
temp.tv_nsec = end.tv_nsec-start.tv_nsec;
}
return temp;
}
public :
CPerformance_clock(){}
/**
* Starts the clock by taking the initial measure
*/
void start()
{
assert(clock_gettime(CLOCK_MONOTONIC_RAW,&t1) == 0);
}
long int getElapsedTime()
{
timespec t2, final;
assert (clock_gettime(CLOCK_MONOTONIC_RAW,&t2) == 0);
final = diff(t1, t2);
return (final.tv_sec * 1000000000) + final.tv_nsec;
}
void restart()
{
clock_gettime(CLOCK_REALTIME,&t1);
}
};
};
我使用此代码控制最小,最大和平均时间
if(t > max_time)
{
max_time = t;
}
if(t < min_time)
{
min_time = t;
}
++count_time;
sum_time += t;
chunk_sum_time +=t;
++chunk_count_time;
没什么特别的。 但是当我执行程序时,最长时间总是有一个额外的时间值: 最短时间:831 ns,40784,Max_time:9773850 ns,1123 最长时间远远超过总执行时间,所以我不明白这一点。我不会在显示数据的过程中进行任何转换,也不会丢失数据。
我已经读了这篇文章Linux clock_gettime(CLOCK_MONOTONIC) strange non-monotonic behavior,但我的内核是最新的,虽然也是一个ubuntu。
要完成,我使用CLOCK_MONOTONIC,CLOCK_REALTIME,CLOCK_MONOTONIC_RAW进行测试,没有解决此问题。
此外,我不确定这是否重要,但我正在虚拟机上编程和执行此程序。
一些帮助?
编辑:举一个我的问题的例子:我在大约60秒内处理4.000.000的结果。每个结果的平均时间为4000纳秒。一个奇怪的错误可能是14秒,但程序运行平稳,在任何时刻停止14秒。
在执行500.000个结果(在3秒内执行)时,我得到类似的MAX_TIME,例如9秒。
提前致谢
答案 0 :(得分:1)
波动是由OS调度程序引起的。它会暂停您的流程,并有机会运行其他流程。
您可以使用CLOCK_PROCESS_CPUTIME_ID
报告结果吗?