while(true)

文章:while(true) 循环与 CPU 占用率问题

 

1、为什么死循环占用 CPU 高?

一个进程如果是死循环,那么占有的 CPU 会很高,可是操作系统时间片运行的,到了一定时间不是会自动切换到别的进程吗?既然即便是死循环,到时间还是会切换到别的进程,为什么占用 CPU 会高呢?

当切换到别的进程时,别的进程告诉系统自己没什么事情要做,不需要那么多的时间,这个时候系统就会切换到下一个进程,直到回到这个死循环的进程上,而这个进程无论什么时候都再循环,所以一直会报告有事情要做,系统就会把尽可能多的时间分给它实际上是这个死循环任务用光了别的进程节省下来的时间。

(虽然不是很准确,真正的进程调度实现比上面说的复杂得多,不过应该可以解释这个问题了)。

while(true) {
    // code
}

改进之后:

while(true) {
    Sleep(1);  

    // code
}

其实只添加了一句 Sleep(1),但是 CPU 占用率就直接从 100% 跌到了 1% 左右。

 

2for(;;)while(true) 的区别?

for(;;) 死循环里的两个分号代表两个空语句,编译器一般会优化掉它们,直接进入循环体。

while(true) 死循环里的 true 被看成表达式,每次循环都要判断表达式是否为真。

即相对来说 for 死循环要更加高效一点。

当然以上条件还要看编译器的优化,一些编译器优化的两者并无区别,但是并非所有的编译器都做了这样的优化。

You may also like...