[問題] 精準的Sleep function

看板C_and_CPP (C/C++)作者 (eleghost)時間9年前 (2016/06/14 18:22), 編輯推噓4(4021)
留言25則, 7人參與, 最新討論串1/1
我是在VISUAL STUDIO 2013下CODING x64環境 win7 上compile, win10上run. 我想實現精準的SLEEP FUNCTION, 但一直無法精準... 方法1: http://codepad.org/CxkgujFy 方法2: http://codepad.org/6KGumdVO 不知道我的程式出甚麼問題, 或各位有較好的寫法呢? 謝謝!! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.248.58.124 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1465899757.A.2CB.html

06/14 18:29, , 1F
精準指的是誤差範圍要到多少呢?
06/14 18:29, 1F

06/14 18:29, , 2F
Windows環境似乎做不到絕對的精準?
06/14 18:29, 2F

06/14 18:33, , 3F
QueryPerformanceFrequency() 寫錯了
06/14 18:33, 3F

06/14 19:00, , 4F
你可以用chrono的high_resolution_clock
06/14 19:00, 4F

06/14 19:01, , 5F
VC++的實作方式也是用QueryPerformanceFrequency
06/14 19:01, 5F

06/14 19:16, , 6F
謝謝回復, 精準到ms等級即可.
06/14 19:16, 6F

06/14 19:34, , 7F
QueryPerformanceCounter() 準確到 us 級並沒有問題
06/14 19:34, 7F

06/14 19:34, , 8F
所以你遇到什麼樣的麻煩?
06/14 19:34, 8F

06/14 22:46, , 9F
我想問 QueryPerformanceCounter 確定可準到 us ??
06/14 22:46, 9F

06/14 23:27, , 10F
看 CPU 而定,Sandy bridge 以後的 CPU 可以到 ns 以下
06/14 23:27, 10F

06/14 23:27, , 11F
但光是執行 QueryPerformanceCounter() 就要兩百多 ns
06/14 23:27, 11F

06/14 23:28, , 12F
它就是直接去執行 CPU 的 RDTSC (RDTSCP) 指令而已
06/14 23:28, 12F

06/14 23:29, , 13F
#1IGT3gmB (C_and_CPP) 有解說各種計時function的精確度
06/14 23:29, 13F

06/15 00:56, , 14F
問題在於1ms的sleep要幹嘛?
06/15 00:56, 14F

06/15 03:05, , 15F
好吧, 那應該是我之前有誤會些什麼了, 之前對 Windows 的
06/15 03:05, 15F

06/15 03:05, , 16F
印象就是要 sleep 或 timer ,精度上限都在數十 ms 級。
06/15 03:05, 16F

06/15 03:27, , 17F
也只有 performance counter 系列有 ns 級的準確度而已
06/15 03:27, 17F

06/15 03:28, , 18F
其他就如你所說是 multimedia timer 的 ms 級
06/15 03:28, 18F

06/15 03:30, , 19F
而且 performance counter 沒有對應的 sleep 和 alarm
06/15 03:30, 19F

06/15 03:31, , 20F
所以原 PO 這樣做 busy waiting 實在也是逼不得已
06/15 03:31, 20F

06/15 19:35, , 21F
若在裡面放sleep(0)就可避開,只是準度應該又會降。
06/15 19:35, 21F

06/16 00:26, , 22F
realtime os
06/16 00:26, 22F

06/16 01:23, , 23F
QueryPerformanceCounter()是用來做高精度timestamp用的
06/16 01:23, 23F

06/16 01:25, , 24F
Windows的thread time slice一般就是10或15ms
06/16 01:25, 24F

06/16 01:26, , 25F
所以幾ms的sleep()無意義
06/16 01:26, 25F
文章代碼(AID): #1NNzhjBB (C_and_CPP)
文章代碼(AID): #1NNzhjBB (C_and_CPP)