[分享] c++11 <chrono> 粗淺心得

看板C_and_CPP作者 (實中最後台客)時間12年前 (2013/06/27 05:51), 編輯推噓10(1004)
留言14則, 13人參與, 最新討論串1/1
前言: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
推 新c++11 先賢傳說 首部曲
06/27 06:39, 1F

06/27 08:13, , 2F
先賢 +1
06/27 08:13, 2F

06/27 10:28, , 3F
分時距和時刻,.NET也是這樣。Java應該也差不多。
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
PUSH
06/27 12:57, 6F

06/27 15:36, , 7F
c++又長大了= =
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
(本文已被刪除) <chrono> 粗淺心得 (?)
06/27 17:27, 10F

06/27 18:04, , 11F
所以其實有兩個隱藏版主分別叫 chrono 和 random (?
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
樓樓樓上 那我們可以 #include <loveme00835> 嗎(?
06/29 22:47, 14F
文章代碼(AID): #1Hos9Bfq (C_and_CPP)