1. 程式人生 > >深入淺出計算機組成原理:通過你的CPU主頻,我們來談談“性能”究竟是什麽?(第3講)

深入淺出計算機組成原理:通過你的CPU主頻,我們來談談“性能”究竟是什麽?(第3講)

但是 網絡 strong 我們 差異 int 情況下 內核 自己

一、性能到底指的是什麽?

買新電腦的時候,我們會說:"原來的電腦性能跟不上了"
寫程序的時候,我們會說:"這個程序西能需要優化一下"

1、"性能"到底指的是什麽?

在計算機組成原理乃至體系結構中"性能"都是最重要的一個主題。我在前面說過學習和研究計算機組成原理,就是在理解計算機是怎麽運作的,

以及為什麽要這麽運作。"為什麽"?所要解決的事情,很多時候就是提升"性能"

2、性能有幾個指標?分別是什麽

計算機的性能,其實和我們幹體力勞動很像,好比是我們要搬東西,對於計算機的性能,我們需要有個標準來衡量這個標準中主要有兩個指標

響應時間

技術分享圖片

響應時間:第一個是響應時間或者叫執行事假,要想提升響應時間這個性能指標,你可以理解為計算機"跑的更快"

響應時間指的就是,我們執行一個程序,到底需要花多少時間,花的時間越少,自然性能就越好

吞吐率

技術分享圖片

吞吐率:第二個是吞吐率或者帶寬,想要提升這個指標,你可以理解為讓計算機"搬得更多"

服務器使用的網絡帶寬,通常就是一個吞吐率性能指標,

吞吐率是指我們在一定的時間範圍內,到底能處理多少事情,這裏的"時間",在計算機裏就是處理數據或者執行的程序指令

3、如何提高性能?

1、縮短程序的相應時間能提高吞吐率嗎?

和搬東西來比,如果我們的響應時間短,跑得快,我們可以來回多跑幾趟多搬幾趟,所以說,縮短程序的響應時間,一般來說都會提升吞吐率

2、除了縮短響應時間,我們還有別的方法嗎?

當然有,比如說,我們還可以多找幾人一起來搬,這就是類似現代的服務器都是8核、16核的人多力量大,同時處理數據,在單位時間內就可以處理更多的數據,吞吐率自然就上去了

二、CPU跑分軟件

各大CPU和服務器廠商組織了一個叫SPEC的第三方機構,專門用來指定各種"跑分"的規則

技術分享圖片


提供的CPU基準測試程序,就好像CPU屆的"高考",通過數十個不同的計算機程序,對於的性能給出一個最終評分,

三、計算機的計時單位:時鐘

雖然時間是一個很自然的用來衡量性能的指標、但是用時間來衡量時,有兩個問題

第一就是時間“不準”

第一就是時間不準 如果你隨便寫的一個程序,來統計程序運行的時間,每一次統計結果不會完全一樣。有可能這一次花了45ms,下一次變成了53ms

1、但是計算機可能同時運行著好多程序,CPU實際上不停地在各個程序之間進行切換。在這些走掉的時間裏,很可能CPU切換去運行別的程序了,

2、而且,遊戲程序在運行的時候,可能要從網絡、硬盤去讀取數據,要等網絡和應哦按把數據讀出來,給到內存和CPU
所以說:要想準確統計某個程序運行時間,進而去比較兩個程序的實際性能,我們得把這些時間給刨刪掉

[[email protected] ~]# time seq 1000000 | wc -l
1000000

real	0m0.101s   #Wall Clock Time 也就是運行程序整個過程中流失的時間
user	0m0.031s   #CPU在運行你的程序,在用戶態運行指令的時間,
sys	0m0.016s   #CPU在運行你的程序,在操作系統內核裏運行指令的時間

而程序實際花費的CPU執行時間,就是User Time加上sys Time

在我給的這個例子裏,你可以看到,實際上程序用了0.101s,但是CPU Time只有0.031+0.016=0.047s。運行程序的時間裏,
只有不到一半是是花在這個程序上的

技術分享圖片

其次、及時我們已經拿到了CPU時間,我們也不一定可以直接"比較"出兩個程序的性能差異

即使在統一臺計算機上,CPU可能滿載運行也可能降頻運行,降頻運行的時間自然花的時間會多一些

除了CPU之外,時間這個西能指標還會受到主板、內存這些其他相關硬件的影響,所以我們需要對"時間"這個我們可以感知的指標進行拆解
把程序的CPU執行時間編程CPU時鐘周期數C和時鐘周期時間的乘積

程序的CPU執行時間=CPU時鐘周期數*時間周期時間

四、什麽是時鐘周期時間?

比如我手頭這臺電腦就是Intel Core-i7-7700HQ 2.8GHz,這裏2.8GHz就是電腦的主頻,可以先粗淺地認為cpu1秒時間內,可以執行的簡單質量的數量是2.8G條

準確一點描述2.8GHz就代表CPU的一個“鐘表”能識別出來的最小的時間間隔,就像我們掛在墻上的掛鐘的最小能夠識別單位就是秒

在這個的CPU上,這個時鐘周期時間,就是1/2.8G。我們的 CPU,是按照這個“時鐘”提示的時間來進行自己的操作。主頻越高,意味著這個表走得越快,

1、超頻

就相當於把買回來的CPU內部的鐘給調快了,於是CPU的計算跟著這個時鐘的節奏,也就自然快了,

當然這個快不是沒有代價的,CPU跑得越快,散熱的壓力也就越大,就和人一樣,超過生理極限,CPU就會崩潰了

2、程序的 CPU 執行時間 = 指令數×CPI×Clock Cycle Time

如果能夠減少程序需要的CPU時鐘周期數,一樣能夠提升程序性能

每條指令的平均時鐘周期數,不同指令需要的Cycles 是不同的,加法和乘法都對應著一條 CPU 指令但是乘法需要的 Cycles 就比加法要多,自然也就慢。

在這樣拆分了之後,我們的程序的 CPU 執行時間就可以變成這樣三個部分的乘積

程序的 CPU 執行時間 = 指令數×CPI×Clock Cycle Time

1、時鐘周期時間

就是計算機主頻,這個取決於計算機硬件,我們所熟知的摩爾定律就一直在不停地提高我們計算機的主頻

比如說,我最早使用的80386主頻只有33MHZ,現在手頭的筆記本就有2.8GHz,在主頻層面,就提升了將近100倍

2、每條指令的平均時鐘周期數CPI

每條指令的平均時鐘周期數CPI,就是一條指令到底需要多少CPU Cycle,在後面講解CPU結構的時候,我們會看到,現代CPU

通過流水線技術,讓一條指令需要的CPU Cycle盡可能地少,因此對於CPI的優化,也是計算機組成和體系結構中重要的一環

3、指令數

指令數,代表執行我們的程序到底需要多少條指令,用那些指令。這個很多時候就把挑戰交給了編譯器,同樣的代碼,編譯

成計算機指令時候,就有格子能夠不同的表示方式

我們可以把自己想像成一個CPU,坐在那裏寫程序。計算機主頻就好像是你打字的速度,打字越快,你自然可以多寫一點程序;

CPI相當於你在寫程序的時候,熟悉各種快捷鍵,越是打同樣的內容,需要敲擊鍵盤的次數就越少,

指令相當於你的程序設計的夠合理,同樣的程序要寫的代碼行數就少

如果三者皆能實現,你自然可以很快地寫出一個優秀的程序,你的“性能”從外面來看就是好的

五、課後題以及問題

1、課後題

每次有新手機發布的時候,總會有一些對於手機的跑分結果的議論。乃至於有“作弊”跑分或者“針對跑分優化”的說法。我們能針對“
“跑分”作弊麽?怎麽做到呢?“作弊”出來的分數對於手機性能還有參考意義?

2、經典答案

可以通過超頻作弊,也就是老師說的調高時鐘,這種做法事不顧功耗專門針對跑分來全力沖刺,不能作為日常使用的標準,不過依然能反應出機器性能的極限,如果用戶可以選擇進入超頻狀態,一些發燒友有特殊需求時是能用上的。
不太清楚跑分測試的機制,似乎是送樣機給相關機構,是不是還能直接給出特殊機型來作弊呢?這種就完全是欺騙了。
2019-04-29
作者回復: ??只要有考試,總會出現有作弊的情況的。不過現在已經很罕見了,大家對於跑分也沒有那麽關註了

3、問題:為什麽user + sys 運行出來會比real time 多呢

[[email protected] ~]# time seq 1000000 | wc -l
1000000

real	0m0.058s   #Wall Clock Time 也就是運行程序整個過程中流失的時間
user	0m0.047s   #CPU在運行你的程序,在用戶態運行指令的時間,
sys		0m0.044s	#CPU在運行你的程序,在操作系統內核裏運行指令的時間

4、作者回復

我知道原因了,這個的確是因為“並行原因”的運行的。雖然seq和wc這兩個命令都是單線程運行的,但是這兩個命令在多核cpu運行的情況下,會分別分配到兩個不同的cpu,

於是user和sys的時間都是兩個cpu上運行的時間之和,就可能超過real的時間。你可以這樣來快速驗證運行

time seq 100000000 | wc -l &

讓這個命令多跑一會兒,並且在後臺運行。

然後利用 top 命令看不同進程的cpu占用情況,你會在top的前幾行裏看到seq和wc的cpu占用都接近100,實際是各被分配到了一個不同的cpu執行。

我寫文稿測試的時候開了一個1u的最小的虛擬機,只有一個cpu所以不會遇到這個問題。

深入淺出計算機組成原理:通過你的CPU主頻,我們來談談“性能”究竟是什麽?(第3講)