2011-07-22 22 views
1

我想简报的程序与这个类:clock_gettime返回一些交流中心值

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,最大时间:9773850 ns在1123 最大时间远远长于总执行时间,所以我不'不明白这一点。我不会在显示数据的过程中进行任何转换或分割,以免丢失数据。

我readed这个职位,Linux clock_gettime(CLOCK_MONOTONIC) strange non-monotonic behavior,但我的内核是最新的,虽然是一个Ubuntu了。

要完成,我做了测试与CLOCK_MONOTONIC,CLOCK_REALTIME,CLOCK_MONOTONIC_RAW,并没有解决这个问题。

而且,我不知道这个问题,但我的编程和虚拟机上执行此程序。

有帮助吗?

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

在500.000结果(execued在3秒内)出现了类似MAX_TIMEs,像9秒执行。

在此先感谢

+0

也许这只是一个调度问题? –

+0

调度程序?这是什么? – Killrazor

+0

你知道,操作系统会暂停你的进程,并给其他进程运行的机会..如果你使用CLOCK_PROCESS_CPUTIME_ID,会发生什么? –

回答

1

该波动是由OS调度程序引起的。它会暂停您的流程,并让您有机会运行其他流程。

你能够回报与CLOCK_PROCESS_CPUTIME_ID结果?

+0

已处理4100000个条目至今 最小时间:0 ns在9899,最大时间:4814392 ns在368618 平均时间:522 ns为4099842结果 块平均时间:2796 ns为49999结果 看起来好多了 – Killrazor