通過程式設計控制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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- CPU利用率過高的原因
- springboot~通過面向介面程式設計對控制反轉IOC的理解Spring Boot程式設計
- Windows 平臺計算 CPU 總利用率Windows
- 如何順利通過程式設計面試程式設計面試
- mysql中CPU或記憶體利用率過高問題MySql記憶體
- 通過 Socket 實現 TCP 程式設計入門TCP程式設計
- 通過 Socket 實現 UDP 程式設計 入門UDP程式設計
- GPU程式設計--CPU和GPU的設計區別GPU程式設計
- 程式設計師如何一次通過軟考?程式設計師
- 通過 SingleFlight 模式學習 Go 併發程式設計模式Go程式設計
- 程式設計通識程式設計
- 無需程式設計,通過配置零程式碼生成CRUD RESTful API程式設計RESTAPI
- 如何通過一句話讓程式設計師暴走?程式設計師
- 007 Rust 非同步程式設計,通過 join 執行 FutureRust非同步程式設計
- 單週期cpu設計程式碼解讀
- 提升CPU等資源的利用率,減少CPU的空轉
- Android通過Chronometer控制元件實現計時功能Android控制元件
- 可程式設計作息時間控制器設計程式設計
- 網路通訊程式設計程式設計
- Linux 中 CPU 利用率是如何算出來的?Linux
- 通過HTTP Header控制快取HTTPHeader快取
- 程式設計師一般通過什麼途徑接私活?程式設計師
- 深入 Nodejs 原始碼探究 CPU 資訊的獲取與利用率計算NodeJS原始碼
- 通過動效學習UI設計UI
- mysql資料庫Cpu利用率100%問題排查MySql資料庫
- 可程式設計序控制器(PLC)程式設計
- 十一課堂|通過小遊戲學習Ethereum DApps程式設計(2)遊戲APP程式設計
- 一種通過程式設計面試的演算法 - malisper.me程式設計面試演算法Lisp
- 通過 for 迴圈,比較 Python 與 Ruby 程式設計思想的差別Python程式設計
- 網路程式設計-Socket通訊程式設計
- 系統程式設計——管道通訊程式設計
- 一些通過SAPABAP程式碼審查得出的ABAP程式設計最佳實踐程式設計
- Java程式設計:通過獲取當前時間,判斷今天星期幾Java程式設計
- SQL Server CPU 利用率毛刺的分析定位與解決SQLServer
- Facebook開源Aroma: 通過機器學習向程式設計師推薦程式碼模板機器學習程式設計師
- 一些通過SAP ABAP程式碼審查得出的ABAP程式設計最佳實踐程式設計
- Go程式設計技巧–Goroutine的優雅控制Go程式設計
- VC++ MFC程式設計版本資訊控制C++C程式程式設計
- 程式設計師需要了解的硬核知識之CPU程式設計師