【发布时间】:2018-10-04 17:32:07
【问题描述】:
我需要创建需要轮询硬件设备的软件。
static void Main(string[] args)
{
while(true)
{
DoSomething();
Task.Delay(1).Wait();
}
}
static void DoSomething(){}
我注意到,如果我不添加最小的延迟,那么 CPU 使用率会达到 30-40%,但即使延迟 1 毫秒,使用率也会保持在百分之几左右。
我的开发环境是.net/c#。
对于我和企业来说,没有必要增加 1 毫秒的延迟,但它似乎让世界变得不一样了。
感觉即使添加一点延迟也是一个好主意。为什么?
编辑:
鉴于上面的那段代码,DoSomething() 为空,为什么添加 Task.Delay(1).Wait(); 会大大降低 CPU 使用率?
感觉是一件很琐碎的事情。怎么会有这么大的影响?
【问题讨论】:
-
这不是一个微小的延迟。就处理器而言,1ms 是一个很长的时间。
DoSomething()是做什么的?如果需要 1 毫秒,CPU 使用率将减少 50% -
当您没有任何延迟时,您的 DoSomething 方法将被尽快调用,而您的 CPU 正在为其工作而无需任何休息。但是,当您添加 1 毫秒延迟时,CPU 会从您的方法中休息 1 毫秒(10 000 个 cpu 滴答声)。
-
顺便说一句,1 毫秒的延迟更像是 15.6 毫秒,这是 Windows 上计时器的默认分辨率。即使你指定 1ms,延迟也至少是 15.6
-
如果您不添加延迟,您只需在循环中执行 DoSomething()。当您添加延迟时,会创建一个延续,并且循环的执行会暂停一段时间。请注意,周期不是 1 毫秒,因为 Windows 上计时器的分辨率不是那么小。默认分辨率为 15.6 毫秒(定时器中断每秒 64 次)。
-
您真正希望多久轮询一次每台设备?什么设备?例如,有些不能那么快地轮询。如果您确实需要快速轮询,则可以更改系统的计时器分辨率,但会增加功耗。 Chrome 因这样做而臭名昭著。另一方面,视频、音频等多媒体服务需要更快的计时器使用特殊服务和 API 来工作。