作者s4300026 (s4300026)
看板C_and_CPP
標題[問題] 計時長度不相同的問題
時間Wed Jul 29 19:28:15 2020
開發平台(Platform): (Ex: Win10, Linux, ...)
win7
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
VC++ 2010
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
問題(Question):
我使用QueryPerformanceCounter, 和
QueryPerformanceFRequence
去夾1us的時間, 我的cpu頻率為300ns
但輸出的時間卻為 50us (重複計時次數達百次以上會出現)
單次計時的時間是正確的, 夾到的時間為900ns
餵入的資料(Input):
想要計時的時間長度
預期的正確結果(Expected Output):
每次輸出均接近, 為 900ns 或 1200ns
都可以被接收
錯誤結果(Wrong Output):
重複計數次數達百次以上(for迴圈的判斷式)
會出現計時長度延遲
即我希望計時長度為1us
實際計時長度卻為 50us (且分佈不均)
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
https://ideone.com/gXjVF0
補充說明(Supplement):
https://i.imgur.com/NFNDEKy.jpg
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.137.29.147 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1596022097.A.AB0.html
※ 編輯: s4300026 (114.137.29.147 臺灣), 07/29/2020 19:28:43
※ 編輯: s4300026 (114.137.29.147 臺灣), 07/29/2020 19:31:18
1F:推 Schottky: 你是不是誤會了 QueryPerformanceFrequency() 的意思07/29 22:45
2F:→ Schottky: wish_tick 為什麼只有 307/29 22:45
3F:→ Schottky: 呃,QueryPerformanceCounter() 出來的數字單位不是 ns07/29 22:47
我改好程式碼了
4F:推 mmmmei: 而且我覺得os也不是只跑你這個行程 時間一定只會多不會少07/30 00:52
可是我是跑 for和while迴圈,
你的意思是 我執行迴圈內容時
cpu偷跑出去做其他事情了的意思
造成 "我計時器大部分的時間計時是正確的
但偶爾計時會不準確",這個現象。
※ 編輯: s4300026 (114.137.29.147 臺灣), 07/30/2020 09:45:09
5F:→ CumCumCum: 你可以燒機把cpu使用率撐到100就知道了 07/30 11:51
6F:→ descent: 你是想做到 1us 的精準度嗎? 07/30 17:55
7F:→ s4300026: 是的,我希望每次呼叫都是切出1us,目前可以做到短次數 07/30 18:42
8F:→ s4300026: 呼叫可以很正確的,高次數呼叫,就會有一些些計時時間 07/30 18:42
9F:→ s4300026: 明顯超出範圍 07/30 18:42
10F:→ Lipraxde: 頻率單位怎麼是 ns... 07/30 19:07
11F:推 Schottky: 程式碼是改了,執行結果還是舊的 07/31 02:50
12F:→ Schottky: 請參考置底的貼程式碼網站把真正的程式貼上來 07/31 03:11
13F:→ Schottky: 這不是你真正在用的程式碼吧,Frequency 也拼錯字 07/31 03:13
14F:→ Schottky: 然後你可能需要了解一下作業系統 context switch 的概念 07/31 03:20
已貼上.
15F:→ descent: 不知道你的 "切出1us" 是什麼意思? 07/31 22:21
16F:→ descent: 但是要達到 1us 精準度, windows 應該達不到 07/31 22:22
17F:→ atrix: 如果你的程式是跑在WINDOWS底下,那應該就是做不到的。 07/31 22:22
18F:→ descent: 你可能要考慮 bare-metal 或是 rtos 07/31 22:23
19F:→ atrix: 然後你說CPU偷跑出去做其它是沒錯, 07/31 22:24
20F:→ atrix: 我是叫這件事為[岔斷], 07/31 22:24
21F:→ atrix: 沒有[岔斷]的話,你連鍵盤滑鼠都動不了 07/31 22:24
22F:推 siuoly: 請問各位前輩 假設在個人電腦 實務上要求時間精確到什麽 08/01 08:33
23F:→ siuoly: 單位? 如果在嵌入式系統上會有差別嗎? 08/01 08:33
24F:→ james732: 我記得要特別要求精確必須要有OS配合,也就是用RTOS 08/01 15:56
25F:推 chuegou: 若是嵌入式 以BBB為例 realtime的工作可以交給PRU 08/02 10:05
26F:推 Killercat: select應該是最穩的 但是有沒有穩到你這程度就不知道 08/02 12:23
※ 編輯: s4300026 (42.73.60.90 臺灣), 08/02/2020 23:34:58
27F:推 siuoly: 謝謝回答 我猜實用上電商的大流量要求 還有就是廠房的機 08/03 07:06
28F:→ siuoly: 具會用到RTOS 不過我是想知道電腦需要或者可以精準到什麼 08/03 07:06
29F:→ siuoly: 程度 然後寫過小demo自己模擬行為看看 08/03 07:06
30F:→ s4300026: 我這邊測起來,在cpu沒在執行其他程式的情況下,cpu插斷 08/03 08:53
31F:→ s4300026: 的行為大概費時50us 08/03 08:53
32F:推 Schottky: siuoly> 看你要求時間精確實際上是做什麼事情 08/03 08:59
34F:→ Schottky: 得到 1ns 精確度的時間值和保證每隔 1us 喚醒你是兩回事 08/03 09:03
35F:→ Schottky: 後者以 Windows 或 Linux 是不可能「保證」辦到的 08/03 09:03
36F:→ Schottky: 但前者在 PC 上一般來說是沒什麼問題 08/03 09:04
37F:→ Schottky: 你可以看錶,錶可以給你 1/100 秒的精確度,這很容易 08/03 09:05
38F:→ Schottky: 但要你每一秒低頭看錶一次就顯然不太有實行的可能 08/03 09:05
39F:推 ofd168: S大舉例好容易懂 08/09 22:32
40F:→ MOONRAKER: 沒聽過電商在用RTOS 如果那個電商是一個機器人要模仿 08/11 16:31
41F:→ MOONRAKER: 人類 反應太慢會穿幫 那也許有可能 顆 08/11 16:31