[问题] 计时长度不相同的问题

楼主: s4300026 (s4300026)   2020-07-29 19:28:15
开发平台(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
作者: Schottky (顺风相送)   2020-07-29 22:45:00
你是不是误会了 QueryPerformanceFrequency() 的意思wish_tick 为什么只有 3呃,QueryPerformanceCounter() 出来的数字单位不是 ns
作者: mmmmei (mmm煤)   2020-07-30 00:52:00
而且我觉得os也不是只跑你这个行程 时间一定只会多不会少
作者: CumCumCum (2 hard 2 hard)   2020-07-30 11:51:00
你可以烧机把cpu使用率撑到100就知道了
作者: descent (“雄辩是银,沉默是金”)   2020-07-30 17:55:00
你是想做到 1us 的精准度吗?
楼主: s4300026 (s4300026)   2020-07-30 18:42:00
是的,我希望每次呼叫都是切出1us,目前可以做到短次数呼叫可以很正确的,高次数呼叫,就会有一些些计时时间明显超出范围
作者: Lipraxde (Lipraxde)   2020-07-30 19:07:00
频率单位怎么是 ns...
作者: Schottky (顺风相送)   2020-07-31 02:50:00
程式码是改了,执行结果还是旧的请参考置底的贴程式码网站把真正的程式贴上来这不是你真正在用的程式码吧,Frequency 也拼错字然后你可能需要了解一下作业系统 context switch 的概念
作者: descent (“雄辩是银,沉默是金”)   2020-07-31 22:21:00
不知道你的 "切出1us" 是什么意思?但是要达到 1us 精准度, windows 应该达不到
作者: atrix (班班)   2020-07-31 22:22:00
如果你的程式是跑在WINDOWS底下,那应该就是做不到的。
作者: descent (“雄辩是银,沉默是金”)   2020-07-31 22:23:00
你可能要考虑 bare-metal 或是 rtos
作者: atrix (班班)   2020-07-31 22:24:00
然后你说CPU偷跑出去做其它是没错,我是叫这件事为[岔断],没有[岔断]的话,你连键盘鼠标都动不了
作者: siuoly (放空)   2020-08-01 08:33:00
请问各位前辈 假设在个人电脑 实务上要求时间精确到什么单位? 如果在嵌入式系统上会有差别吗?
作者: james732 (好人超)   2020-08-01 15:56:00
我记得要特别要求精确必须要有OS配合,也就是用RTOS
作者: chuegou (chuegou)   2020-08-02 10:05:00
若是嵌入式 以BBB为例 realtime的工作可以交给PRU
作者: Killercat (杀人猫™)   2020-08-02 12:23:00
select应该是最稳的 但是有没有稳到你这程度就不知道
作者: siuoly (放空)   2020-08-03 07:06:00
谢谢回答 我猜实用上电商的大流量要求 还有就是厂房的机具会用到RTOS 不过我是想知道电脑需要或者可以精准到什么程度 然后写过小demo自己模拟行为看看
楼主: s4300026 (s4300026)   2020-08-03 08:53:00
我这边测起来,在cpu没在执行其他程式的情况下,cpu插断的行为大概费时50us
作者: Schottky (顺风相送)   2020-08-03 08:59:00
siuoly> 看你要求时间精确实际上是做什么事情#1IGT3gmB (C_and_CPP) 这篇可以参考一下得到 1ns 精确度的时间值和保证每隔 1us 唤醒你是两回事后者以 Windows 或 Linux 是不可能“保证”办到的但前者在 PC 上一般来说是没什么问题你可以看表,表可以给你 1/100 秒的精确度,这很容易但要你每一秒低头看表一次就显然不太有实行的可能
作者: ofd168 (大色狼来袭)   2020-08-09 22:32:00
S大举例好容易懂
作者: MOONRAKER (㊣牛鹤鳗毛人)   2020-08-11 16:31:00
没听过电商在用RTOS 如果那个电商是一个机器人要模仿人类 反应太慢会穿帮 那也许有可能 颗

Links booklink

Contact Us: admin [ a t ] ucptt.com