簡體   English   中英

<time.h> clock()無法正常工作

[英]<time.h> clock() does not work properly

我試圖估算代碼塊的持續時間(特別是為了獲得基於物理的動畫的幀速率獨立性的時間步長,因此分辨率應為毫秒級)。 堆棧溢出的問題主要是建議使用clock()方法,我已經嘗試過了,但似乎無法正常工作。 我已經使用gettimeoftheday()方法解決了這個問題,但是我仍然對clock()為什么失敗感到好奇。 這是我的代碼塊:

for (int i = 0; i < 10000; i++)
{
    std::cout << "time: " << clock() << std::endl;
    usleep(1000);
}

這將以一定的速度打印時間。 當我將usleep值增加到1000000時,打印時鍾值的增加率急劇下降。 我認為clock()應該給出與絕對時間值相關的值,而與我的代碼無關。

提前致謝。

PS:為了避免可能的誤會,我並不是在抱怨打印比例下降。 usleep(1000)和usleep(1000000)之間在特定增量時間打印的值不同。

我認為clock()應該提供與絕對時間值相關的值

你錯了 從其規范(C99 7.32.2.1)

clock功能確定使用的處理器時間

如果需要絕對時間,請使用timestd::chrono庫中合適的時鍾,或者使用不太方便的時鍾,例如clock_gettimegettimeofday

問題的假設是錯誤的,但是我不得不反對這個問題,因為時間測量和時間API令人困惑,因此用戶正確地提出這樣的問題。

  • 有“實時時鍾”,它試圖跟蹤“日歷時間”中的幾點,即人們使用的時間。 它們可以前進1小時,后退1小時,前進1秒,等等。這些絕對不能用於測量計算時間。 因此time(),gettimeofday()和clock_gettime(CLOCK_REALTIME)都消失了。
  • 有“單調時鍾”,它試圖以與他人協調的方式跟蹤實時經過。 這些時鍾永遠不會回到過去,並且與“實時時鍾”不同,它們是可用於衡量性能的時鍾。 他們仍然可以隨時調整,例如放慢速度或加快1秒鍾以與其他人同步。 它們非常便於移植,例如,通過使用clock_gettime(CLOCK_MONOTONIC)。
  • 有“原始時鍾”,它試圖在不與他人協調的情況下跟蹤實時通過。 Linux具有clock_gettime(CLOCK_MONOTONIC_RAW),它僅使用硬件時鍾進行計數。 只要您想將花費在睡眠或等待I / O上的時間包括在內,這些對於衡量在過程上花費的時間確實非常有用。 從中長期來看,由於硬件時鍾漂移和振盪,它們不能用來與其他人協調時間。
  • 有“ cpu時鍾”,它試圖跟蹤cpu的使用時間。 它們可能包括用戶代碼時間,內核時間,但不包括進程正在休眠的時間。 clock_gettime(CLOCK_PROCESS_CPUTIME_ID),times()和clock()返回它們。
  • 最后,還有“計時器”,它們使用以上時鍾以或多或少的精確間隔實現可重復的定時信號。 這些就是timer_create(),timerfd_create()和setitimer()之類的東西。

給定問題描述,我將使用最后一個進行計算:設置一個1秒間隔的計時器,該計時器在完成后觸發信號。 然后打印您可以繪制的幀數。 您可以稍后使用此數字來調整幀渲染的復雜度。

暫無
暫無

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

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