通過程式設計控制CPU利用率
今天想起一個幾年前學習過的程式,是在《程式設計之美》中提到的,是作為當時微軟的面試題,寫一個程式來控制CPU的利用率保持在50%,進一步延伸,能夠寫出程式來畫出CPU利用率的正弦曲線。
這個題目看起來真是奇怪,能夠達到這種程度,程式設計感覺就是出神入化了,但是仔細看看這個題目還是有一些依據可循,也有點小聰明的意思。
首先,對我們來說,能夠直觀感受CPU利用率就是通過工作管理員來得到的,我們可以大體的觀察得到,基本上重新整理CPU利用率的情況是按照秒來更新的,任何額外的操作都可能造成CPU的抖動,比如我開啟另外一個程式,或者動動滑鼠之類的。
所以在程式中,處理的時候CPU就開始忙起來了,如果想在一定的時間頻度內給予CPU空閒時間,使得CPU利用率保持在50%,就代表
(CPU忙碌/(CPU忙碌+CPU空閒)=50%
從程式中來實現,CPU忙碌可以通過迴圈來實現,而空閒則可以通過sleep來實現。
關於這個實現,自己使用瞭如下的程式碼
這個程式來本地的環境中測試,因為是多CPU的,所以得到的結果總是不太滿意,沒有達到預期,在單核的情況是沒有問題的。
我靈機一動,可以通過Total CPU的使用率來說明。在工作管理員->效能 頁面的右下角,有個資源監控的按鈕,點進去就能看到一些詳細的資訊了。
得到了基本的要求,使得CPU利用率在50%左右,我們可以得到一個更為複雜的例子,就是畫出正弦曲線來。
這個例子在本地測試基本得到了預期的效果。
使用的程式碼如下:
得到的圖表如下,是不是有點味道。
可以通過這個例子看到,如果明白一些基本的知識點,結合實際還是能夠得到很多意想不到的效果,學以致用在這個時候還是挺有趣的。
這個題目看起來真是奇怪,能夠達到這種程度,程式設計感覺就是出神入化了,但是仔細看看這個題目還是有一些依據可循,也有點小聰明的意思。
首先,對我們來說,能夠直觀感受CPU利用率就是通過工作管理員來得到的,我們可以大體的觀察得到,基本上重新整理CPU利用率的情況是按照秒來更新的,任何額外的操作都可能造成CPU的抖動,比如我開啟另外一個程式,或者動動滑鼠之類的。
所以在程式中,處理的時候CPU就開始忙起來了,如果想在一定的時間頻度內給予CPU空閒時間,使得CPU利用率保持在50%,就代表
(CPU忙碌/(CPU忙碌+CPU空閒)=50%
從程式中來實現,CPU忙碌可以通過迴圈來實現,而空閒則可以通過sleep來實現。
關於這個實現,自己使用瞭如下的程式碼
點選(此處)摺疊或開啟
-
public class CPUTest
-
{
-
public static void main(String[] args)
-
{
-
long startTime = 0;
-
int busyTime = 10;
-
int idleTime = 10;
-
while (true)
-
{
-
startTime = System.currentTimeMillis();
-
while (System.currentTimeMillis() - startTime <= busyTime)
-
try
-
{
-
Thread.sleep(idleTime);
-
}
-
catch (InterruptedException e)
-
{
-
e.printStackTrace();
-
}
-
}
- }
- }
我靈機一動,可以通過Total CPU的使用率來說明。在工作管理員->效能 頁面的右下角,有個資源監控的按鈕,點進去就能看到一些詳細的資訊了。
得到了基本的要求,使得CPU利用率在50%左右,我們可以得到一個更為複雜的例子,就是畫出正弦曲線來。
這個例子在本地測試基本得到了預期的效果。
使用的程式碼如下:
點選(此處)摺疊或開啟
-
public class CPUTest
-
{
-
-
-
public static void main(String[] args) throws Exception {
-
final double SPLIT = 0.01;
-
final int COUNT = (int) (2 / SPLIT);
-
final double PI = Math.PI;
-
final int INTERVAL = 200;
-
long[] busySpan = new long[COUNT];
-
long[] idleSpan = new long[COUNT];
-
int half = INTERVAL / 2;
-
double radian = 0.0;
-
for (int i = 0; i < COUNT; i++) {
-
busySpan[i] = (long) (half + (Math.sin(PI * radian) * half));
-
idleSpan[i] = INTERVAL - busySpan[i];
-
radian += SPLIT;
-
}
-
long startTime = 0;
-
int j = 0;
-
while (true) {
-
j = j % COUNT;
-
startTime = System.currentTimeMillis();
-
while (System.currentTimeMillis() - startTime < busySpan[j])
-
;
-
Thread.sleep(idleSpan[j]);
-
j++;
-
}
- }
- }
可以通過這個例子看到,如果明白一些基本的知識點,結合實際還是能夠得到很多意想不到的效果,學以致用在這個時候還是挺有趣的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1454146/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 解決perl程式使CPU利用率過高
- Windows 平臺計算 CPU 總利用率Windows
- 如何順利通過程式設計面試程式設計面試
- 通過socket實現DUP程式設計程式設計
- springboot~通過面向介面程式設計對控制反轉IOC的理解Spring Boot程式設計
- 【故障處理】序列cache值過小導致CPU利用率過高
- mysql中CPU或記憶體利用率過高問題MySql記憶體
- 通過 Socket 實現 TCP 程式設計入門TCP程式設計
- 通過 Socket 實現 UDP 程式設計 入門UDP程式設計
- 如何通過程式設計發現Java死鎖程式設計Java
- 異常等待事件Resmgr:Cpu Quantum導致CPU利用率高事件
- GPU程式設計--CPU和GPU的設計區別GPU程式設計
- 程式設計師如何一次通過軟考?程式設計師
- 程式設計通識程式設計
- 檢視linux系統CPU利用率Linux
- 《通過遊戲程式設計實戰教新手學C++程式設計》學習筆記遊戲程式設計C++筆記
- python 多cpu並行程式設計Python並行行程程式設計
- 無需程式設計,通過配置零程式碼生成CRUD RESTful API程式設計RESTAPI
- 通過ASP.NET程式設計進行遠端殺死程式ASP.NET程式設計
- 如何通過一句話讓程式設計師暴走?程式設計師
- Linux程式控制程式設計Linux程式設計
- 通過內部的hint來控制執行計劃
- 單週期cpu設計程式碼解讀
- 深入 Nodejs 原始碼探究 CPU 資訊的獲取與利用率計算NodeJS原始碼
- 007 Rust 非同步程式設計,通過 join 執行 FutureRust非同步程式設計
- 通過 SingleFlight 模式學習 Go 併發程式設計模式Go程式設計
- 通過追蹤程式設計師的眼球來預防Bug程式設計師
- 通過top命令抓取cpu高消耗的sqlSQL
- Linux 中 CPU 利用率是如何算出來的?Linux
- Facebook開源Aroma: 通過機器學習向程式設計師推薦程式碼模板機器學習程式設計師
- 如何通過閱讀別人的程式碼提高自己的程式設計能力程式設計
- 通過動效學習UI設計UI
- 通過Struts應用MVC設計模型MVC模型
- 網路通訊程式設計程式設計
- Android通過Chronometer控制元件實現計時功能Android控制元件
- PHP通過lock控制程式只執行一次PHP
- 通過程式碼控制View的觸控事件被觸發View事件
- 程式設計師一般通過什麼途徑接私活?程式設計師