任何人都可以解释为什么以下无限循环占用大量CPU(CPU usage has increased upto 50% if total core is 2 and 100% if total CPU core is just 1
)
但是,如果我取消注释该行,它会减少到1或2个CPU使用率?
public class Program
{
public static void Main(string[] args)
{
while (true)
{
//Console.WriteLine("hello..");
}
}
}
答案 0 :(得分:6)
Console.WriteLine
是一个阻塞(可中断)I / O调用,因此当处理器在I / O上被阻塞时可能会发生其他事情。事实上,它在I / O上花费的时间明显多于,而不是评估琐碎条件true
和跳跃!
如果没有写字线呼叫,您的处理器将完全忙碌,无法中断。
尝试使用Console.WriteLine
或任何不阻止的内容替换int x = 1
。这应该像空体情况一样。
答案 1 :(得分:2)
当行被注释掉时,while循环什么都不做,只消耗CPU旋转一圈。当您调用WriteLine时,您的程序会调用暂时暂停您的进程的操作系统。这导致您的程序被阻止"在大多数情况下,只在write()系统调用之间消耗CPU。
答案 2 :(得分:1)
原因是因为您的CPU在执行该循环时无法执行任何其他操作。 CPU不知道无限循环不是一个复杂的计算,只需要大量的迭代。因此,它不断评估真实条件,导致消耗增加CPU使用率。
您可能还想查看Halt and Catch Fire
旁注:
如果您想避开无限循环,那么您只需使用WaitHandle
即可。要让流程退出外部世界,请使用带有唯一字符串的EventWaitHandle
。
答案 3 :(得分:1)
CPU花费所有时间检查true
是否为真,编译器没有对其进行优化。使用WriteLine
时,进程可以在写入控制台时阻止,从而降低整体CPU使用率。