2012-11-28 73 views
6

我需要知道如何以納秒計算C代碼中函數的時間。 我試圖重複該功能,直到消耗一些微秒。 time.h中是否有其他函數可用於計算納秒時間?以C代碼計算函數時間(以納秒爲單位)

+0

納秒級的精確度至多高度取決於平臺。什麼平臺 - Windows/Linux /嵌入的東西? –

+0

不,並且測量單個函數調用不是很有用。你可以使用clock()。 – Cubic

+1

如果您使用的是Linux,Linux不是實時平臺。它的調度程度以毫秒爲單位。 – MOHAMED

回答

9

你永遠不會得到納秒級的精度。想想你在問什麼:在1 GHz CPU上1納秒是一個時鐘週期。不管你試圖打電話,你永遠不會得到那種準確性,你最好堅持幾微秒。有很多例子的類似問題在這裏:C++ Cross-Platform High-Resolution Timer

僅適用於c:在想要使用QueryPerformanceCounter的窗口上。這裏更多的是QPCHere是關於如何使用QueryPerformanceCounter的相關問題。

+0

timespec_get返回高達納秒,四捨五入爲執行決議。檢查出http:// stackoverflow。com/a/36095783/2680660 – Efreeto

+0

@efreet我沒說你不能得到一個納秒的返回值,我說它不準確,因此比毫秒返回值更有用。 – chacham15

1

無論您如何處理此類問題或您使用的是何種類型的系統/操作系統,最好都會得到一個近似的答案,由於問題的性質而有相當大的差異。

其次,你需要一個支持這種呼叫的系統。這是很容易,如果你正在使用QNX Neutrino中:

http://www.qnx.com/developers/docs/6.3.0SP3/neutrino/lib_ref/c/clock_gettime.html

/* 
* This program calculates the time required to 
* execute the program specified as its first argument. 
* The time is printed in seconds, on standard out. 
*/ 
#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <time.h> 

#define BILLION 1000000000L; 

int main(int argc, char** argv) 
    { 
    struct timespec start, stop; 
    double accum; 

    if(clock_gettime(CLOCK_REALTIME, &start) == -1) { 
     perror("clock gettime"); 
     return EXIT_FAILURE; 
    } 

    system(argv[1]); 

    if(clock_gettime(CLOCK_REALTIME, &stop) == -1) { 
     perror("clock gettime"); 
     return EXIT_FAILURE; 
    } 

    accum = (stop.tv_sec - start.tv_sec) 
      + (double)(stop.tv_nsec - start.tv_nsec) 
      /(double)BILLION; 
    printf("%lf\n", accum); 
    return EXIT_SUCCESS; 
    } 
0

標準C的clock功能是不是這個有用。它通常具有可怕的解決方案,並且它在測量經過的掛牆時間或CPU消耗的時間方面(平臺之間)不一致。您應該使用POSIX標準的clock_gettime函數(它具有納秒分辨率,可以指定要測量的時鐘),並使用在缺乏POSIX功能的平臺上可用的任何系統特定的時鐘操作進行仿真。

+0

注意:「納秒分辨率」和「納秒精度」之間存在差異。此外,他想要一個Windows解決方案,這不是(對不起,他在評論中提到它,我只是添加了標籤)。 – chacham15

0

調用該函數足夠的時間,你得到的總秒的時間,使用任何方法測量(甚至是普通的C時鐘())。以微米/納秒爲單位的測量本質上太不精確。

要進行基準測試,您需要QueryPerformanceCounter。這是Windows上最好的秒錶。請參閱:How to use QueryPerformanceCounter?然而,使用它來衡量(例如)單個函數調用仍然會非常不精確;我認爲你需要花費第二個時間來獲得良好的信噪比來進行測量。採取任何你想要的時間進行多次測量,其價值比較它們的標準偏差,以確保您充分精確測量。

Multimedia Timers可能是最好的時鐘(注意時鐘和秒錶的區別:一個措施絕對時間,只有等時間間隔)在Windows上使用。您應該可以通過timeGetTime()獲得接近毫秒的分辨率和精度。

相關問題