1. 程式人生 > >程式碼執行時 CPU佔用率100%的解決方法

程式碼執行時 CPU佔用率100%的解決方法

原因:

       建立連線後啟動新的執行緒,如果執行緒中有簡單粗暴的不含阻塞的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()還是必不可少的。