为什么在轮询期间添加一个微小的延迟会减少 CPU 使用率?
How come adding even a tiny delay during polling reduces CPU usage?
我需要创建需要轮询硬件设备的软件。
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 的使用量?
感觉是一件多么微不足道的事情。怎么会有这么大的影响?
写类似
的东西
while (true)
{
DoSomething();
}
你实际上是在告诉编译器构建一个可以像这样翻译成人类语言的代码:
Dear CPU, please do as fast as you can DoSomething()
.
这就是为什么 CPU 负载会在您添加一个微小的延迟时下降的原因。因为那时,代码将被翻译成这样的:
Dear CPU, please do DoSomething()
, and then you can rest for millions of cycles. After that, do DoSomething()
again.
请注意,对于工作在 2-4 GHz 频率的 CPU,1 毫秒已经很多了。
假设 DoSomething
占用 0.1 ms
。然后,没有延迟,每秒执行 10_000
次。由于延迟,它每秒执行的次数少于 900
次。如评论中所述,实际延迟取决于 OS,可以是 15.6 ms
,因此实际上您每秒可能有 ~60
次调用。
因此 CPU 必须完成的工作量大不相同。
我需要创建需要轮询硬件设备的软件。
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 的使用量?
感觉是一件多么微不足道的事情。怎么会有这么大的影响?
写类似
的东西while (true)
{
DoSomething();
}
你实际上是在告诉编译器构建一个可以像这样翻译成人类语言的代码:
Dear CPU, please do as fast as you can
DoSomething()
.
这就是为什么 CPU 负载会在您添加一个微小的延迟时下降的原因。因为那时,代码将被翻译成这样的:
Dear CPU, please do
DoSomething()
, and then you can rest for millions of cycles. After that, doDoSomething()
again.
请注意,对于工作在 2-4 GHz 频率的 CPU,1 毫秒已经很多了。
假设 DoSomething
占用 0.1 ms
。然后,没有延迟,每秒执行 10_000
次。由于延迟,它每秒执行的次数少于 900
次。如评论中所述,实际延迟取决于 OS,可以是 15.6 ms
,因此实际上您每秒可能有 ~60
次调用。
因此 CPU 必须完成的工作量大不相同。