買新電腦的時候,咱們會說:"原來的電腦性能跟不上了"
寫程序的時候,咱們會說:"這個程序西能須要優化一下"編程
在計算機組成原理乃至體系結構中"性能"都是最重要的一個主題。我在前面說過學習和研究計算機組成原理,就是在理解計算機是怎麼運做的,bash
以及爲何要這麼運做。"爲何"?所要解決的事情,不少時候就是提高"性能"服務器
計算機的性能,其實和咱們幹體力勞動很像,比如是咱們要搬東西,對於計算機的性能,咱們須要有個標準來衡量這個標準中主要有兩個指標網絡
響應時間:第一個是響應時間或者叫執行事假,要想提高響應時間這個性能指標,你能夠理解爲計算機"跑的更快"性能
響應時間指的就是,咱們執行一個程序,到底須要花多少時間,花的時間越少,天然性能就越好學習
吞吐率測試
吞吐率:第二個是吞吐率或者帶寬,想要提高這個指標,你能夠理解爲讓計算機"搬得更多"
服務器使用的網絡帶寬,一般就是一個吞吐率性能指標,
吞吐率是指咱們在必定的時間範圍內,到底能處理多少事情,這裏的"時間",在計算機裏就是處理數據或者執行的程序指令優化
一、縮短程序的相應時間能提升吞吐率嗎?spa
和搬東西來比,若是咱們的響應時間短,跑得快,咱們能夠來回多跑幾趟多搬幾趟,因此說,縮短程序的響應時間,通常來講都會提高吞吐率操作系統
二、除了縮短響應時間,咱們還有別的方法嗎?
固然有,好比說,咱們還能夠多找幾人一塊兒來搬,這就是相似現代的服務器都是8核、16核的人多力量大,同時處理數據,在單位時間內就能夠處理更多的數據,吞吐率天然就上去了
各大CPU和服務器廠商組織了一個叫SPEC的第三方機構,專門用來指定各類"跑分"的規則
提供的CPU基準測試程序,就好像CPU屆的"高考",經過數十個不一樣的計算機程序,對於的性能給出一個最終評分,
雖然時間是一個很天然的用來衡量性能的指標、可是用時間來衡量時,有兩個問題
第一就是時間不許 若是你隨便寫的一個程序,來統計程序運行的時間,每一次統計結果不會徹底同樣。有可能這一次花了45ms,下一次變成了53ms
一、可是計算機可能同時運行着好多程序,CPU實際上不停地在各個程序之間進行切換。在這些走掉的時間裏,極可能CPU切換去運行別的程序了,
二、並且,遊戲程序在運行的時候,可能要從網絡、硬盤去讀取數據,要等網絡和應哦按把數據讀出來,給到內存和CPU
因此說:要想準確統計某個程序運行時間,進而去比較兩個程序的實際性能,咱們得把這些時間給刨刪掉
[root@nfs ~]# 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時鐘週期數C和時鐘週期時間的乘積
程序的CPU執行時間=CPU時鐘週期數*時間週期時間
好比我手頭這臺電腦就是Intel Core-i7-7700HQ 2.8GHz,這裏2.8GHz就是電腦的主頻,能夠先粗淺地認爲cpu1秒時間內,能夠執行的簡單質量的數量是2.8G條
準確一點描述2.8GHz就表明CPU的一個「鐘錶」能識別出來的最小的時間間隔,就像咱們掛在牆上的掛鐘的最小可以識別單位就是秒
在這個的CPU上,這個時鐘週期時間,就是1/2.8G。咱們的 CPU,是按照這個「時鐘」提示的時間來進行本身的操做。主頻越高,意味着這個表走得越快,
就至關於把買回來的CPU內部的鐘給調快了,因而CPU的計算跟着這個時鐘的節奏,也就天然快了,
固然這個快不是沒有代價的,CPU跑得越快,散熱的壓力也就越大,就和人同樣,超過生理極限,CPU就會崩潰了
若是可以減小程序須要的CPU時鐘週期數,同樣可以提高程序性能
每條指令的平均時鐘週期數,不一樣指令須要的Cycles 是不一樣的,加法和乘法都對應着一條 CPU 指令可是乘法須要的 Cycles 就比加法要多,天然也就慢。
在這樣拆分了以後,咱們的程序的 CPU 執行時間就能夠變成這樣三個部分的乘積
程序的 CPU 執行時間 = 指令數×CPI×Clock Cycle Time
就是計算機主頻,這個取決於計算機硬件,咱們所熟知的摩爾定律就一直在不停地提升咱們計算機的主頻
好比說,我最先使用的80386主頻只有33MHZ,如今手頭的筆記本就有2.8GHz,在主頻層面,就提高了將近100倍
每條指令的平均時鐘週期數CPI,就是一條指令到底須要多少CPU Cycle,在後面講解CPU結構的時候,咱們會看到,現代CPU
經過流水線技術,讓一條指令須要的CPU Cycle儘量地少,所以對於CPI的優化,也是計算機組成和體系結構中重要的一環
指令數,表明執行咱們的程序到底須要多少條指令,用那些指令。這個不少時候就把挑戰交給了編譯器,一樣的代碼,編譯
成計算機指令時候,就有格子可以不一樣的表示方式
咱們能夠把本身想像成一個CPU,坐在那裏寫程序。計算機主頻就好像是你打字的速度,打字越快,你天然能夠多寫一點程序;
CPI至關於你在寫程序的時候,熟悉各類快捷鍵,越是打一樣的內容,須要敲擊鍵盤的次數就越少,
指令至關於你的程序設計的夠合理,一樣的程序要寫的代碼行數就少,
若是三者皆能實現,你天然能夠很快地寫出一個優秀的程序,你的「性能」從外面來看就是好的
每次有新手機發布的時候,總會有一些對於手機的跑分結果的議論。乃至於有「做弊」跑分或者「針對跑分優化」的說法。咱們能針對「
「跑分」做弊麼?怎麼作到呢?「做弊」出來的分數對於手機性能還有參考意義?
能夠經過超頻做弊,也就是老師說的調高時鐘,這種作法事不顧功耗專門針對跑分來全力衝刺,不能做爲平常使用的標準,不過依然能反應出機器性能的極限,若是用戶能夠選擇進入超頻狀態,一些發燒友有特殊需求時是能用上的。
不太清楚跑分測試的機制,彷佛是送樣機給相關機構,是否是還能直接給出特殊機型來做弊呢?這種就徹底是欺騙了。
2019-04-29
做者回復: 👍只要有考試,總會出現有做弊的狀況的。不過如今已經很罕見了,你們對於跑分也沒有那麼關注了
[root@nfs ~]# time seq 1000000 | wc -l 1000000 real 0m0.058s #Wall Clock Time 也就是運行程序整個過程當中流失的時間 user 0m0.047s #CPU在運行你的程序,在用戶態運行指令的時間, sys 0m0.044s #CPU在運行你的程序,在操做系統內核裏運行指令的時間
我知道緣由了,這個的確是由於「並行緣由」的運行的。雖然seq和wc這兩個命令都是單線程運行的,可是這兩個命令在多核cpu運行的狀況下,會分別分配到兩個不一樣的cpu,
因而user和sys的時間都是兩個cpu上運行的時間之和,就可能超過real的時間。你能夠這樣來快速驗證運行
time seq 100000000 | wc -l &
讓這個命令多跑一下子,而且在後臺運行。
而後利用 top 命令看不一樣進程的cpu佔用狀況,你會在top的前幾行裏看到seq和wc的cpu佔用都接近100,實際是各被分配到了一個不一樣的cpu執行。
我寫文稿測試的時候開了一個1u的最小的虛擬機,只有一個cpu因此不會遇到這個問題。