你的程序使用了多少CPU,秒知!
朋友們,相信大家日夜操練,代碼已經擼了不少了,在跟代碼打交道的時候,大家有沒有思考過一個問題,想過你的代碼完成一個循環或者處理其它事件它到底花了多少時間嗎?
“什麼,Martin 老師你不是裝逼吧,居然還可以知道代碼運行所花的時間?”
--“沒錯!”,我通常會假裝斯文的深吸一口中華後,意味深長的說。
。。。。。。
既然裝了,就是要解釋清楚的。下面,我就跟大家普及普及,講得不好,蘿蔔青菜滴不要,請大家猛戳點贊戳死我!
大家都知道,任何計算機的硬件裏都有 CPU這玩意,這哥們可不是來裝逼的,它的全稱是中央處理器(Central Processing Unit ),既然是帶了“中央”頭銜,作用也是霸氣滴不行,如下:
處理指令 控制程序中指令的執行順序。程序中的各指令之間是有嚴格順序的,必須嚴格按程序規定的順序執行,才能保證計算機系統工作的正確性。
執行操作 一條指令的功能往往是由計算機中的部件執行一系列的操作來實現的。CPU要根據指令的功能,產生相應的操作控制信號,發給相應的部件,從而控制這些部件按指令的要求進行動作。比如,在控制檯顯示“ Hello World”!
控制時間 時間控制就是對各種操作實施時間上的定時, 比如:不同程序對應的指令什麼時候開始執行,執行多久?在一條指令的執行過程中,在什麼時間做什麼操作均應受到嚴格的控制。只有這樣,計算機纔能有條不紊地指揮衆多的應用程序和硬件工作。
處理數據 主要是對數據進行算術運算和邏輯運算。
好!霸氣側漏的東西自然有它霸氣的理由!由於涉及到的信息量巨大,爲了不太爲難大家的腦袋上扛着的這塊“CPU”,今天我只講講我們CPU和時間的話題。要搞清楚這個話題,我們需要來點前戲:
我們電腦是裝了這麼多應用程序,很多程序可以同時執行,比如:你可以一邊看着小視頻,一邊聊着QQ,同時你的迅雷還在下載着其他的小視頻,這些老爺機(請原諒我把以前只有一塊CPU的電腦稱之爲老爺機)只用一塊CPU是怎麼做到呢?
答案在此 :操作系統(Windows、Unix 和Linux等)會把CPU進行微秒(1微妙 = 0.000001秒)級別的分片,稱之爲時間片,即微觀上CPU分配給各個程序運行的時間,每個應用程序被分配一個極短的時間段讓CPU控制其運行,這個時間段稱作它的時間片,即該進程此次允許運行的時間,然後,這些應用程序在規定的時間片內運行,一旦時間結束,就馬上切換給下一個程序運行,因爲時間片被劃分在微妙級別,所以,以我們常人這種0.2秒的反應速度看來,電腦上的程序寶寶們是同時進行的。
(注:如果在時間片結束時進程還在運行,則CPU將被剝奪並分配給另一個進程。如果進程在時間片結束前阻塞或結束,則CPU當即進行切換。而不會造成CPU資源浪費。在宏觀上:我們可以同時打開多個應用程序,每個程序並行不悖,同時運行。但在微觀上:由於只有一個CPU,一次只能處理某個應用程序的一小部分,如何做到對所有應用程序處理公平,主流方法就是引入時間片,每個程序輪流執行。)
好!搞清楚了時間片的概念,接下來就好理解程序完成一個循環或者處理其它事件所花的時間這個概念了,沒錯,它就是指 CPU 用來執行這段代碼所花的時間片之和!
比如下面這段代碼:
for(int i=0; i<10000; i++) ;
假設CPU運行這段代碼,被分成10個時間片才能運行完,每個時間片是1微秒,那麼真正所花在運行代碼上的CPU時間是:10 x 1 = 10 微秒
好!說到這裏,很多同學可能會大聲叫好!終於理解這個概念了!Martin 牛逼,Martin 威武!Martin xxx xxx
但是,如何獲得這個時間,難道要自己去算嗎?
不會! C庫已經幫我們準備了一個函數,它就是計時函數是clock(),聲明如下:
#include <time.h>
clock_t clock(void);
描述:
clock() 函數精確的返回當前程序已運行的的CPU時間。如果要換算成秒,需要將返回的結果除以 CLOCKS_PER_SEC 的值,如果獲取失敗,則返回 -1.
在這裏,有的朋友可能會嚇一跳,clock_t 是啥,請原諒我還是個小白呀!!!
其實,它只是個長×××數,和long 一樣一樣滴! 爲什麼,你學會了使用typedef 自定義類型,一切都不會再感到驚訝,它其實就是:
typedef long clock_t;
或許大家另外還會有個疑問, CLOCKS_PER_SEC 又是什麼?那麼我來告訴大家,這玩意定義在time.h文件中,它用來表示一秒鐘會有多少個時鐘計時單元,其定義如下:
#define CLOCKS_PER_SEC ((clock_t)1000)
它意味着,每過千分之一秒(1毫秒),我們調用clock()函數返回的值就加1。
到次爲止, 大家應該就知道該怎麼玩耍了吧?還不懂? 來一段代碼帶大家理解一下, 下面的代碼帶大家獲取你的機器運行1千萬次 -- 操作所花的時間:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
int main(void)
{
long times = 10000000L;
clock_t start, end;
double duration;
/* 測量一個事件持續的時間*/
printf( "執行 %ld 次循環 -- 操作所花的時間: ", times );
start = clock();
/* 程序先休息兩秒,這時候不消耗CPU時間 */
usleep(2000000);
while( times-- ) ;
end = clock();
duration = (double)(end - start) / CLOCKS_PER_SEC;
printf( "%f 秒\n", duration );
system("pause");
return 0;
}
在我筆記本上運行的結果是: