有什麼辦法來檢查由POSIX提供的gettimeofday()函數的粒度?粒度在時間函數
粒度在時間函數
回答
在緊密的循環中調用它,注意當前值和前一個值之間的差異。像下面這樣:
#include <stdio.h>
#include <sys/time.h>
int main()
{
struct timeval timevals[2];
int cur = 0;
while (1) {
gettimeofday(&timevals[cur], NULL);
int diff = timevals[cur].tv_usec - timevals[!cur].tv_usec;
if (diff)
printf("%d\n", diff);
cur = !cur;
}
}
在我的系統似乎粒度約2微秒(約50/50一個或兩個微秒,在這很可能是由於任務切換成百上千異常值)。
由於您正在計算格式化差異所用的時間,因此您高估了延遲。你應該在'cur =!cur;'後立即調用'gettimeofday(&timevals [!cur],NULL);'以使調用之間的差距最小化。您可能會發現結果通常爲零 - 因爲您的機器足夠快,可以在一微秒內完成兩個'gettimeofday()'調用。不要忘記,如果您的CPU以3 GHz運行,則微秒爲3000個時鐘週期;你可以在3000個時鐘週期內做很多事情。 –
而不是gettimeofday()
,考慮使用clock_gettime()
(指定CLOCK_REALTIME
時鐘)。這也是POSIX,並支持clock_getres()
函數來獲得分辨率。
但是'clock_getres'總是會返回1 ns,而不是實時定時器分辨率.... – osgx
目前POSIX的方式來獲得gettimeofday的分辨率()是
#include <unistd.h>
long ticks_per_sec = sysconf(_SC_CLK_TCK);
在舊的POSIX版本(當發生變化不能確定),該值CLOCKS_PER_SEC被#define的。
CLOCKS_PER_SEC是標準C,適用於'clock()'; '_SC_CLK_TCK'適用於'times()'。 'gettimeofday()'也不適用。 –
- 1. 更改時間戳粒度
- 2. 計算時間粒度
- 3. C++細粒度時間
- 4. 粒度SQL日期時間的
- 5. 函數時間複雜度
- 6. 什麼是細粒度和粗粒度超時
- 7. 細粒度粗粒度加密API
- 8. 數組函數的時間複雜度
- 9. 時間複雜度的對數函數
- 10. WSD任務的細粒度和粗粒度評分之間的區別?
- 11. 服務粒度
- 12. 粒度WSDL
- 13. 每個函數的Python時間度量
- 14. 計算函數的空間複雜度和時間複雜度
- 15. INET Nordic FIX協議延伸至納秒粒度時間戳
- 16. 顯示NTFS時間戳記爲100納秒粒度
- 17. 預約/預訂系統dayview,問題與時間粒度
- 18. vlcj - 如何獲得最細粒度的當前視頻時間?
- 19. MongoDB聚合:具有粒度的時間序列
- 20. 熊貓時間序列圖xticks二級粒度
- 21. 在每個特定時間間隔後調度r函數
- 22. 構造函數或setter注入時依賴關係的粒度是多少?
- 23. Moment.js - 日期粒度
- 24. 聲明dygraph粒度
- 25. 細粒度鎖定
- 26. Redmine任務粒度
- 27. 細粒度沙盒
- 28. SSAS - 關係/粒度
- 29. WebOS中的細粒度計時
- 30. 精細粒度轉換與粗粒度轉換
我不清楚你的問題:每標準分辨率爲微秒 - 「有gettimeofday()函數將獲取當前時間,表示爲自紀元秒和毫秒」 你是問是否有一種編程方式檢查系統時鐘的分辨率是否小於1微秒? – RomanK
@RomanK:分辨率和粒度不是一回事。 POSIX確實指定了微秒,但在給定的實現中,這些微秒每次只能增加1000, – caf