Clock_gettime返回一些额外的值

clock_gettime returns some extrange values

本文关键字:gettime 返回 Clock      更新时间:2023-10-16

我想用这个类来分析一个程序:

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;

没什么特别的。但是当我执行程序时,最大时间总是有一个额外的时间值:Min time: 831 ns在40784,Max_time: 9773850 ns在1123最大时间比总执行时间长得多,所以我不理解。我在显示数据的过程中不做任何转换或分割,以免丢失数据。

我读过这篇文章,Linux的clock_gettime(CLOCK_MONOTONIC)奇怪的非单调行为,但我的内核是最新的,虽然也是ubuntu。

最后,我用CLOCK_MONOTONIC, CLOCK_REALTIME, clock_单调ic_raw进行了测试,没有解决这个问题。

另外,我不确定这是否重要,但是我正在虚拟机上编程和执行这个程序。

一些帮助吗?

编辑:举一个我的问题的例子:我在大约60秒内处理了4.000.000个结果。每个结果的平均时间为4000纳秒。一个奇怪的错误可能是14秒,但程序运行平稳,在任何时候停止14秒。

在执行500.000个结果(在3秒内执行)时,我得到类似的MAX_TIMEs,比如9秒。

Thanks in advance

波动是由操作系统调度程序引起的。它将暂停您的进程,并给其他进程一个运行的机会。

你能报告CLOCK_PROCESS_CPUTIME_ID的结果吗?