【C++】擴充套件std::chrono功能以處理執行時(非編譯時)恆定週期

2020-12-01 C++

我已經在Linux和OSX上嘗試了各種計時器,並想嘗試用std::chrono使用的相同介面(interface)包裝其中的一些計時器。

這對於在編譯時具有明確“週期”的計時器很容易做到,例如POSIX clock_gettime()系列,OSX上的clock_get_time()系列或gettimeofday()。

但是,有些有用的計時器僅在執行時才知道“週期”(雖然為常數)。
例如:
-POSIX指出clock()的週期CLOCKS_PER_SEC在非XSI系統上可能是變數
-在Linux上,times()的時間段在執行時由sysconf(_SC_CLK_TCK)給出
-在OSX上,mach_absolute_time()的週期在執行時由mach_timebase_info()給出
-在最新的Intel處理器上,DST暫存器以固定速率滴答,但當然只能在執行時確定

要將這些計時器包裝在std::chrono介面(interface)中,一種可能性是使用一段std::chrono::nanosecond,並將每個計時器的值轉換為納秒。另一種方法可能是使用浮點表示。但是,這兩種方法都會給now()函式帶來一個(很小的)開銷,以及(可能很小的)精度損失。

我嘗試採用的解決方案是定義一組類,以表示此類“執行時常量”時段,這些類的構建方式與std::ratio類相同。
但是,我希望這將需要重寫所有相關的模板類和函式(因為它們假定使用constexpr值)。

我該如何在la std:chrono中包裝這些計時器?

還是在時鐘的時間段內使用非constexpr值?

解決辦法

Does anyone have any experience with wrapping these kind of timers a la std:chrono ?



其實我知道在OSX上,您感興趣的平臺之一。 :-)

您提到:

on OSX, the period of mach_absolute_time() is given at runtime by mach_timebase_info()



完全正確。同樣在OSX上,high_resolution_clocksteady_clocklibc++實現實際上基於mach_absolute_time。我是該程式碼的作者,該程式碼是具有慷慨許可的開原始碼(只要您保留版權,便可以使用它進行任何操作)。

這是libc++'s steady_clock::now() 的來源。它的構建方式幾乎與您推測的一樣。返回之前,執行時間段將轉換為納秒。在OS X上,轉換因子通常為1,並且程式碼利用這一事實進行了優化。但是,該程式碼足夠通用,可以處理非1轉換因子。

第一次呼叫now()時,將執行時間轉換因子查詢為納秒的開銷很小。通常情況下,會計算浮點轉換因子。在通常情況下(轉換因子== 1),後續成本是通過函式指標呼叫的。我發現開銷確實很合理。

在OS X上,儘管直到執行時才確定轉換因子,但轉換因子仍然是一個常數(即在程式執行時不會變化),因此只需要計算一次即可。

如果您的時期實際上是動態變化的,則需要更多基礎結構來處理。本質上,您將需要積分(演算)週期與時間的曲線,然後計算兩個時間點之間的平均週期。這將需要對期間隨時間變化的持續監控,而<chrono>不是正確的工具。此類工具通常在OS級別處理。

出處

Have any Question?

Let us answer it!