代碼運行時 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()還是必不可少的。

發佈了29 篇原創文章 · 獲贊 55 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章