2011-07-22 51 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