作者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/cn.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