2012-12-06 60 views
1

我有一個遞增的整數值,並且希望找到該整數的每秒平均值。我知道C中不存在定時器,除非你做了一些特定的和複雜的事情[對於C來說是新的]有沒有更簡單的方法來做到這一點?優選地,當進行計算時,該值將被重置,以便在該應用程序將長時間運行的內存中不具有如此大的數量。在C中計算每秒的平均值

+0

你在運行這個程序的平臺是什麼樣的? – unwind

+0

在Linux/UNIX上運行這個 – Andrei0427

+0

你問過一個「更簡單」的方法嗎?比什麼更簡單?顯示你當前的代碼,我們可以提出更好的方法。 – Barmar

回答

4

我想你會想包括time.h,並使用它的一些函數和結構(這實際上並不是學習C的基礎知識的一個壞方法)。有一個解釋和幾個例子here

如果您需要亞秒級精度,我建議您使用clock_gettime(),這將使您獲得納秒級分辨率。

下面是一個例子:

#include <stdio.h> 
#include <time.h> 

struct timespec diff(struct timespec start, struct timespec end); 

int main() 
{ 
    struct timespec time1, time2, timeDiff; 
    int temp, i; 

    // Get the start time 
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1); 

    // Do some work 
    for (i = 0; i< 242000000; i++) 
     temp+=temp; 

    // Get the end time 
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2); 

    // Calculate the difference 
    timeDiff = diff(time1,time2); 

    printf("%d.%d\n", timeDiff.tv_sec, timeDiff.tv_nsec); 
    return 0; 
} 

struct timespec diff(struct timespec start, struct timespec end) 
{ 
    struct 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; 
} 

你需要的東西,如編譯:

gcc -o timetest timetest.c -lrt 

命令的-lrt部分告訴C連接器鏈接到實時庫,包含clock_gettime()的定義。

+0

令人驚歎!謝謝!我讚賞你也解釋了編譯器標誌! – Andrei0427

+0

我有一個問題,我如何計時一秒,使用API​​的gettime方法,直到一秒鐘過去? – Andrei0427

+0

這可能會很棘手。你可以重複調用'clock_gettime()'並在1秒後停止,或者你可以'sleep()'1秒。但是如果你想繼續在後臺處理事物,並且有另一個過程來關注時間,那麼你將不得不使用線程或某種事件處理程序......並且這兩個選項都是「特定的複雜「,在OP中使用你的術語。 –

3

您可以使用gettimeofday()來獲得時間值。你需要存儲一個這樣的閱讀,以便你可以比較最近的閱讀和老閱讀,並找出它們之間的時間。如果在幾秒鐘內完成此操作,則可以按照該時間間隔分割整數,並獲得每秒的平均值。