2012-06-20 85 views
3

我想打印我的函數的運行時間。出於某種原因,我的計時器總是返回0.誰能告訴我爲什麼?函數的運行時間

double RunningTime(clock_t time1, clock_t time2) 
{ 
    double t=time1 - time2; 
    double time = (t*1000)/CLOCKS_PER_SEC; 
    return time; 
} 

int main() 
{ 
    clock_t start_time = clock(); 


    // some code..... 


    clock_t end_time = clock(); 

    std::cout << "Time elapsed: " << double(RunningTime(end_time, start_time)) << " ms"; 

    return 0; 
} 

我試圖使用gettimeofday,它仍然返回0。

double get_time() 
{ 
    struct timeval t; 
    gettimeofday(&t, NULL); 
    double d = t.tv_sec + (double) t.tv_usec/100000; 
    return d; 
} 

int main() 
{ 
     double time_start = get_time(); 

     //Some code...... 

     double time_end = get_time(); 

     std::cout << time_end - time_start; 

    return 0; 
} 

使用chrono也試過,它給了我各種編譯錯誤:

  • 錯誤:#ERROR這文件需要對即將到來的ISO C++標準C++ 0x的 編譯器和庫支持。此支持目前是
    的實驗,並且必須啓用-std = C++ 0x或-std = gnu ++ 0x 編譯器選項。
  • 警告:'auto'會改變C++ 0x的含義;請刪除它
  • 錯誤:ISO C++禁止「T1」的聲明,沒有類型的錯誤: 「的std ::時辰」還沒有被宣佈
  • 錯誤:請求成員在「數」「(T2 - T1 )」,這是 非類型的 'INT'

    INT主() { 自動T1 =標準::計時:: high_resolution_clock ::現在();

      //Some code...... 
    
          auto t2 = std::chrono::high_resolution_clock::now(); 
    
          std::cout << "Time elapsed: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count() << " milliseconds\n"; 
    
         return 0; 
        } 
    
+1

考慮使用''如果你想要很好的分辨率。您可以輕鬆地爲單位指定毫秒而不是計算它。 – chris

+0

在* nix系統上,嘗試'gettimeofday()'獲得高分辨率時間(微秒)。 – gavinb

+0

如果你沒有C++ 11,你可以考慮linux上的clock_gettime(使用'CLOCK_MONOTONIC_HR'),或'gethrtime'來處理大多數其他的UNIX變體,以及'Windows上的QueryPerformanceCounter'。 – jxh

回答

3

甲計時器滴答近似等於1/CLOCKS_PER_SEC秒,這是一毫秒的分辨率。看到一個真正的(非零)號,您應該調用一個很長的時間功能,或者使用其他庫具有較高的時間分辨率設施:

  • 新的C++庫11X chrono(使用MSVS 2012)
  • boost::chrono(不幸的是,該庫是指很多人的)
  • POSIX功能gettimeofday,它給你一個1微秒的時間分辨率
+0

gettimeofday的弱點在於它不是單調的,並且在某些事情(如'ntpd')調整系統時間。 – jxh

+0

例如,如果機器正在嘗試與網絡時間服務器保持同步,則爲真。但在這種情況下,它可能是適合的。 – gahcep

+0

我試過使用'gettimeofday',它仍然返回0 – Jmh2013

0

經過大量的試驗和錯誤我gettimeofday去的。這是我的代碼,我終於正常工作。

double get_time() 
{ 
    struct timeval t; 
    gettimeofday(&t, NULL); 
    double d = t.tv_sec + (double) t.tv_usec/1000000; 
    return d; 
} 

int main() 
{ 
    double time_start = get_time(); 

    //Some code......... 

    double time_end = get_time(); 

    std::cout << time_end - time_start; 

    return 0; 
} 
0

我一直在使用一個最近的解決方案使用C++ 11的lambda功能,任何時間任意函數調用或一系列的動作。

#include <ctime> 
#include <iostream> 
#include <functional> 

void timeit(std::function<void()> func) { 
    std::clock_t start = std::clock(); 

    func(); 

    int ms = (std::clock() - start)/(double) (CLOCKS_PER_SEC/1000); 

    std::cout << "Finished in " << ms << "ms" << std::endl; 
} 

int main() { 
    timeit([] { 
     for (int i = 0; i < 10; ++i) { 
      std::cout << "i = " << i << std::endl; 
     } 
    }); 

    return 0; 
}