代码运行时 CPU占用率100%的解决方法
2017-03-26 20:52
369 查看
原因:
建立连接后启动新的线程,如果线程中有简单粗暴的不含阻塞的while(1)循环,会持续占用CPU,导致CPU占用率极高。
解决:
在while(1)的大循环中插入一句sleep(1),即阻塞1毫秒,java线程内则使用Thread.sleep()的静态方法阻塞线程。效果奇佳如图(用C语言演示)
图:优化前(我的电脑是四核cpu,所以单线程无限无阻塞循环占用率不会达到100%)
图:优化后
分析:
这个问题几乎有可能出现在所有持续运作的程序上。虽然只是阻塞了程序一毫秒,但是如果循环内的运算量不大的话,阻塞一毫秒几乎让出了整个CPU的运算资源,还不影响程序的运行。理想情况下,假设原本执行一次循环只需要消耗10个CPU周期的话,如果不进行阻塞,2Ghz的CPU在一秒内会执行2*10^9/10=2*10^8次的循环,然而在1秒内执行那么多次循环对我们的程序一点帮助都没有,还会抢占CPU资源;而阻塞该程序1ms后,相当于每进行一次循环后就让出1ms的运算资源,也就是让出2*10^6个cpu周期,原本占用100%的程序只会占用不到1万次CPU周期,这对于2Ghz的CPU来说几乎是0负担的。以前我混过ACM竞赛,往往敲的代码都是追求指定的时间内完成大规模数据的运算,所以,在while循环中是绝对不可能出现sleep()这种拖时间的代码的,然而,程序在实际应用中,一个小小的sleep()还是必不可少的。
建立连接后启动新的线程,如果线程中有简单粗暴的不含阻塞的while(1)循环,会持续占用CPU,导致CPU占用率极高。
解决:
在while(1)的大循环中插入一句sleep(1),即阻塞1毫秒,java线程内则使用Thread.sleep()的静态方法阻塞线程。效果奇佳如图(用C语言演示)
图:优化前(我的电脑是四核cpu,所以单线程无限无阻塞循环占用率不会达到100%)
图:优化后
分析:
这个问题几乎有可能出现在所有持续运作的程序上。虽然只是阻塞了程序一毫秒,但是如果循环内的运算量不大的话,阻塞一毫秒几乎让出了整个CPU的运算资源,还不影响程序的运行。理想情况下,假设原本执行一次循环只需要消耗10个CPU周期的话,如果不进行阻塞,2Ghz的CPU在一秒内会执行2*10^9/10=2*10^8次的循环,然而在1秒内执行那么多次循环对我们的程序一点帮助都没有,还会抢占CPU资源;而阻塞该程序1ms后,相当于每进行一次循环后就让出1ms的运算资源,也就是让出2*10^6个cpu周期,原本占用100%的程序只会占用不到1万次CPU周期,这对于2Ghz的CPU来说几乎是0负担的。以前我混过ACM竞赛,往往敲的代码都是追求指定的时间内完成大规模数据的运算,所以,在while循环中是绝对不可能出现sleep()这种拖时间的代码的,然而,程序在实际应用中,一个小小的sleep()还是必不可少的。
相关文章推荐
- vmware-vmx.exe进程CPU占用率100%解决方法
- Win XP中CPU占用率100%原因及解决方法(2)
- Win XP中CPU占用率100%原因及解决方法
- Win XP中CPU占用率100%原因及解决方法
- 使用Windows XP操作系统,CPU占用率100%原因及解决方法
- XP中CPU占用率100%原因及解决方法
- vmware-vmx.exe进程CPU占用率100%解决方法
- CPU占用率100%解决方法
- CUDA 程序运行时 CPU 100%的一个解决方法
- vmnat.exe CPU占用率高达100% 解决方法
- 【Android Studio】工程编译运行时CPU瞬间飙升100%解决方法
- Win XP中CPU占用率100%原因及解决方法
- Win XP中CPU占用率100%原因及解决方法
- 解决winXP中CPU占用率100%的方法
- Win XP中CPU占用率100%原因及解决方法
- ImageMagick 解决多线程(openMP)运行时导致CPU暴增到100%的方法
- Win XP中CPU占用率100%原因及解决方法(收藏)
- svchost.exe占用CPU 100%的解决方法
- js实现运行代码需要刷新的解决方法
- IE占CPU资源 100% 解决方法