簡體   English   中英

Clock_gettime納秒計算

[英]Clock_gettime nanoseconds calculation

ref: linux clock_gettime

我發現了一個能很好地處理處理時間的公式,但有些東西我不明白。 請參閱下面的結果。

前兩行只是在各自的列中顯示forumla。

我只是快速顯示3個結果。
有趣的部分是在最后一行,為什么是5551 - 999896062納秒= 18446744072709661105?
為什么18446744072709661105+1/1E9 = 0.000109?

我認為正在進行一些影響結果的數據轉換?

xx:      | t1.tv_sec |   | t1.tv_nsec |          | t2.tv_sec |   | t2.tv_nsec 
xx:      t2-t1(sec)      t2-t1(nsec)         (t2-t1(sec))+(t2-t1(nsec))/1E9

52291:   | 30437 |   | 999649886 |       | 30437 |   | 999759331 
52291:   0   109445          0.000109

52292:   | 30437 |   | 999772970 |       | 30437 |   | 999882416 
52292:   0   109446          0.000109

52293:   | 30437 |   | 999896062 |       | 30438 |   | 5551 
52293:   1   18446744072709661105        0.000109

源代碼:

int main() {
    struct timespec t1, t2;

    int i = 0;
    while(1) {
        clock_gettime(CLOCK_MONOTONIC, &t1);
            for(int j=0;j<25000;j++) { };
        clock_gettime(CLOCK_MONOTONIC, &t2);
        printf("%d: \t | %llu | \t | %lu | \t\t | %llu | \t | %lu \n", i, (unsigned long long) t1.tv_sec, t1.tv_nsec, (unsigned long long) t2.tv_sec, t2.tv_nsec);
        printf("%d: \t %llu \t %lu \t\t %lf\n", i, (unsigned long long) t2.tv_sec - t1.tv_sec, t2.tv_nsec - t1.tv_nsec, (t2.tv_sec - t1.tv_sec)+(t2.tv_nsec - t1.tv_nsec)/1E9);
        if ((t2.tv_sec - t1.tv_sec) == 1) break;
        i++;
    }
    return 0;
}

因為5551 - 999896062是一些負值,存儲在long類型的temp變量中,但由於%lu轉換說明符而被printf解釋為“unsigned long”。

請注意,struct timespec中的tv_nsec字段的類型為long,而不是unsigned long。 類似地,在Linux和其他Unix系統上,time_t是有符號整數類型的typedef。 所以擺脫代碼中所有未簽名的東西。

順便說一句,減去兩個timespec實例的方法是


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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM