[問題] 計時長度不相同的問題

看板C_and_CPP (C/C++)作者 (s4300026)時間5年前 (2020/07/29 19:28), 5年前編輯推噓9(9032)
留言41則, 13人參與, 4年前最新討論串1/1
開發平台(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://www.ptt.cc/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

07/29 22:45, 5年前 , 1F
你是不是誤會了 QueryPerformanceFrequency() 的意思
07/29 22:45, 1F

07/29 22:45, 5年前 , 2F
wish_tick 為什麼只有 3
07/29 22:45, 2F

07/29 22:47, 5年前 , 3F
呃,QueryPerformanceCounter() 出來的數字單位不是 ns
07/29 22:47, 3F
我改好程式碼了

07/30 00:52, 5年前 , 4F
而且我覺得os也不是只跑你這個行程 時間一定只會多不會少
07/30 00:52, 4F
可是我是跑 for和while迴圈, 你的意思是 我執行迴圈內容時 cpu偷跑出去做其他事情了的意思 造成 "我計時器大部分的時間計時是正確的 但偶爾計時會不準確",這個現象。 ※ 編輯: s4300026 (114.137.29.147 臺灣), 07/30/2020 09:45:09

07/30 11:51, 5年前 , 5F
你可以燒機把cpu使用率撐到100就知道了
07/30 11:51, 5F

07/30 17:55, 5年前 , 6F
你是想做到 1us 的精準度嗎?
07/30 17:55, 6F

07/30 18:42, 5年前 , 7F
是的,我希望每次呼叫都是切出1us,目前可以做到短次數
07/30 18:42, 7F

07/30 18:42, 5年前 , 8F
呼叫可以很正確的,高次數呼叫,就會有一些些計時時間
07/30 18:42, 8F

07/30 18:42, 5年前 , 9F
明顯超出範圍
07/30 18:42, 9F

07/30 19:07, 5年前 , 10F
頻率單位怎麼是 ns...
07/30 19:07, 10F

07/31 02:50, 5年前 , 11F
程式碼是改了,執行結果還是舊的
07/31 02:50, 11F

07/31 03:11, 5年前 , 12F
請參考置底的貼程式碼網站把真正的程式貼上來
07/31 03:11, 12F

07/31 03:13, 5年前 , 13F
這不是你真正在用的程式碼吧,Frequency 也拼錯字
07/31 03:13, 13F

07/31 03:20, 5年前 , 14F
然後你可能需要了解一下作業系統 context switch 的概念
07/31 03:20, 14F
已貼上.

07/31 22:21, 5年前 , 15F
不知道你的 "切出1us" 是什麼意思?
07/31 22:21, 15F

07/31 22:22, 5年前 , 16F
但是要達到 1us 精準度, windows 應該達不到
07/31 22:22, 16F

07/31 22:22, 5年前 , 17F
如果你的程式是跑在WINDOWS底下,那應該就是做不到的。
07/31 22:22, 17F

07/31 22:23, 5年前 , 18F
你可能要考慮 bare-metal 或是 rtos
07/31 22:23, 18F

07/31 22:24, 5年前 , 19F
然後你說CPU偷跑出去做其它是沒錯,
07/31 22:24, 19F

07/31 22:24, 5年前 , 20F
我是叫這件事為[岔斷],
07/31 22:24, 20F

07/31 22:24, 5年前 , 21F
沒有[岔斷]的話,你連鍵盤滑鼠都動不了
07/31 22:24, 21F

08/01 08:33, 5年前 , 22F
請問各位前輩 假設在個人電腦 實務上要求時間精確到什麽
08/01 08:33, 22F

08/01 08:33, 5年前 , 23F
單位? 如果在嵌入式系統上會有差別嗎?
08/01 08:33, 23F

08/01 15:56, 5年前 , 24F
我記得要特別要求精確必須要有OS配合,也就是用RTOS
08/01 15:56, 24F

08/02 10:05, 5年前 , 25F
若是嵌入式 以BBB為例 realtime的工作可以交給PRU
08/02 10:05, 25F

08/02 12:23, 5年前 , 26F
select應該是最穩的 但是有沒有穩到你這程度就不知道
08/02 12:23, 26F
※ 編輯: s4300026 (42.73.60.90 臺灣), 08/02/2020 23:34:58

08/03 07:06, 5年前 , 27F
謝謝回答 我猜實用上電商的大流量要求 還有就是廠房的機
08/03 07:06, 27F

08/03 07:06, 5年前 , 28F
具會用到RTOS 不過我是想知道電腦需要或者可以精準到什麼
08/03 07:06, 28F

08/03 07:06, 5年前 , 29F
程度 然後寫過小demo自己模擬行為看看
08/03 07:06, 29F

08/03 08:53, 5年前 , 30F
我這邊測起來,在cpu沒在執行其他程式的情況下,cpu插斷
08/03 08:53, 30F

08/03 08:53, 5年前 , 31F
的行為大概費時50us
08/03 08:53, 31F

08/03 08:59, 5年前 , 32F
siuoly> 看你要求時間精確實際上是做什麼事情
08/03 08:59, 32F

08/03 09:00, 5年前 , 33F
#1IGT3gmB (C_and_CPP) 這篇可以參考一下
08/03 09:00, 33F

08/03 09:03, 5年前 , 34F
得到 1ns 精確度的時間值和保證每隔 1us 喚醒你是兩回事
08/03 09:03, 34F

08/03 09:03, 5年前 , 35F
後者以 Windows 或 Linux 是不可能「保證」辦到的
08/03 09:03, 35F

08/03 09:04, 5年前 , 36F
但前者在 PC 上一般來說是沒什麼問題
08/03 09:04, 36F

08/03 09:05, 5年前 , 37F
你可以看錶,錶可以給你 1/100 秒的精確度,這很容易
08/03 09:05, 37F

08/03 09:05, 5年前 , 38F
但要你每一秒低頭看錶一次就顯然不太有實行的可能
08/03 09:05, 38F

08/09 22:32, 4年前 , 39F
S大舉例好容易懂
08/09 22:32, 39F

08/11 16:31, 4年前 , 40F
沒聽過電商在用RTOS 如果那個電商是一個機器人要模仿
08/11 16:31, 40F

08/11 16:31, 4年前 , 41F
人類 反應太慢會穿幫 那也許有可能 顆
08/11 16:31, 41F
文章代碼(AID): #1V8LrHgm (C_and_CPP)
文章代碼(AID): #1V8LrHgm (C_and_CPP)