[分享] c++11 <chrono> 粗淺心得
前言:c++11 出來之後,發現 http://www.cplusplus.com/reference/
上面多了好幾個有 c++11 圖示的 library
不過有些 lib 如 <chrono> 跟 <random> 板上討論不多
故小的在此回饋一點粗淺的心得。
另外,小的不是本科系,只能就主觀心得寫很淺的東西,
內容可能只適合水平相近的讀者閱讀。如有誤導也先此致歉。
另外,請先確認您的編譯環境支援 c++11,否則無法使用這些 lib。
(小弟的 IDE 是 VS 2012,OS 為 win7 home premium x64。)
先說 <chrono>
http://www.cplusplus.com/reference/chrono/
#include <chrono>
using namespace std::chrono;
◎為何要用<chrono>?
因為 <ctime> 提供的時間資料型態 time_t 只準確到秒
http://www.cplusplus.com/reference/ctime/time_t/
萬一需要測量微秒、毫秒級的時間(如評估程式效率),
或者某些生成隨機數的機制需要快速的 seeding 時,time_t 便不敷使用。
另外還有時鐘穩定性的問題,這裡就不談了(因為我也不懂XD 汗~)
◎它跟 <ctime> 最大的差別,就是資料型態被重新定義過。
<chrono>中的時間,分成兩種資料型態:
1.時距 (duration) (意指 std::chrono::duration。以下皆同。)
2.時點 (time_point)
雖然從實作觀點來想,這些類別裡面存的一定還是數值資料,
但是「使用上」它們跟一般數值資料型態如 int, double, size_t,....
或者 duration 與 time_point 之間
並不存在簡單的對應關係(如隱含轉型或運算子多載),
必須合用 時距轉型算子duration_cast<> 與 計數算子.count()
才能轉成一般的數值型態。
假設有一個時距物件叫做 myDuration,則轉型語法如下
duration_cast<nanoseconds>( myDuration ).count();
duration_cast<microseconds>( myDuration ).count();
...........
其中< >裡的型態當然就是最小計量單位,最大可到 hours。
轉換結果在 x64 環境下,為 64-bit 的無號整數。
此外,只有 duration 型態能夠轉成整數,time_point 型態是不行的──
雖然認真講起來
還是有 system_clock::from_time_t 與 to_time_t 的變換函式,
但是如前所述,time_t 的解析度只到秒,
所以這種轉換可能並不符合使用 <chrono> 的原因。
◎ <chrono> 提供 3 種時鐘:
1) system_clock
2) steady_clock //據說能夠產生單調遞增、且符合物理時間的時點
3) high_resolution_clock //據說解析度較高,但跟系統有關
這些時鐘的解析度跟系統有關,解析度可以用下列方式取得:
std::cout << "precision of high-resolution clock = " <<
static_cast<double>(high_resolution_clock::period::num)
/ high_resolution_clock::period::den << std::endl;
在小弟的環境,三種時鐘的解析度是一樣的(都是100ns),
其他差異暫時就還不曉得。
一般用途下,system_clock 應該就可以了。
◎如果要取得時間是為了做為亂數產生器的種子,參考語法如下:
size_t seed =
duration_cast<nanoseconds>(system_clock::now().time_since_epoch()).count();
// size_t:在 64-bit 環境下定義為 unsigned long long
// system_clock::now():取得現在時間。
// .time_since_epoch():將時點轉為時距,基準點叫做"epoch"
// 估計是 1970/1/1 00:00:00 但可能跟環境有關
注意 system_clock::now() 方法是 static member,
不用宣告任何時鐘物件就能直接呼叫。
除了呼叫方便,
語法的一致性,也方便以 #define 弄成 macro,不用每次都打那一長串。
另外,也可以不宣告 seed 變數,cast完之後直接丟到
隨機數產生器的 constructor 當中做初始化,如此寫法將更加精簡。
--
╰═╞╤ ╤╕ ╪╪╒══╮ ╤╧╤╒═╮╭═ ╪╕ ═ ╒╮╧══╪ 就是愛大姐...
| || ||╞══╡ | |╞═╡╭╤ ╧╧ ||╭═╤╯ + ╭──╮
╰╤ | || ||| | ╧═╧| |||╒═╮╤ ╞╕╭═╪╛ ● |咬我|
||╞ || ||| | ═╪═╞═╡||╰═╛| ||╭─╪╮ < >┤阿!|
||| |╯ ||╞══╡ |||╞╤╛||╒╪ | |╯| || ∕﹨ ╰──╯
|╧╧ | ╰╪╧══╧ ╛ ╯╘╯ ╯╘╪╯╛ ╰ ╰ ╛╰ real㊣temper
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.27.17.103
推
06/27 06:39, , 1F
06/27 06:39, 1F
推
06/27 08:13, , 2F
06/27 08:13, 2F
→
06/27 10:28, , 3F
06/27 10:28, 3F
推
06/27 11:25, , 4F
06/27 11:25, 4F
推
06/27 12:07, , 5F
06/27 12:07, 5F
推
06/27 12:57, , 6F
06/27 12:57, 6F
→
06/27 15:36, , 7F
06/27 15:36, 7F
推
06/27 17:16, , 8F
06/27 17:16, 8F
→
06/27 17:17, , 9F
06/27 17:17, 9F
推
06/27 17:27, , 10F
06/27 17:27, 10F
推
06/27 18:04, , 11F
06/27 18:04, 11F
推
06/28 09:20, , 12F
06/28 09:20, 12F
推
06/29 06:08, , 13F
06/29 06:08, 13F
→
06/29 22:47, , 14F
06/29 22:47, 14F