一、性能到底指的是什么?
買新電腦的時候,我們會說:"原來的電腦性能跟不上了"
寫程序的時候,我們會說:"這個程序西能需要優化一下"
1、"性能"到底指的是什么?
在計算機組成原理乃至體系結構中"性能"都是最重要的一個主題。我在前面說過學習和研究計算機組成原理,就是在理解計算機是怎么運作的,
以及為什么要這么運作。"為什么"?所要解決的事情,很多時候就是提升"性能"
2、性能有幾個指標?分別是什么
計算機的性能,其實和我們干體力勞動很像,好比是我們要搬東西,對於計算機的性能,我們需要有個標准來衡量這個標准中主要有兩個指標
響應時間
響應時間:第一個是響應時間或者叫執行事假,要想提升響應時間這個性能指標,你可以理解為計算機"跑的更快"
響應時間指的就是,我們執行一個程序,到底需要花多少時間,花的時間越少,自然性能就越好
吞吐率
吞吐率:第二個是吞吐率或者帶寬,想要提升這個指標,你可以理解為讓計算機"搬得更多"
服務器使用的網絡帶寬,通常就是一個吞吐率性能指標,
吞吐率是指我們在一定的時間范圍內,到底能處理多少事情,這里的"時間",在計算機里就是處理數據或者執行的程序指令
3、如何提高性能?
1、縮短程序的相應時間能提高吞吐率嗎?
和搬東西來比,如果我們的響應時間短,跑得快,我們可以來回多跑幾趟多搬幾趟,所以說,縮短程序的響應時間,一般來說都會提升吞吐率
2、除了縮短響應時間,我們還有別的方法嗎?
當然有,比如說,我們還可以多找幾人一起來搬,這就是類似現代的服務器都是8核、16核的人多力量大,同時處理數據,在單位時間內就可以處理更多的數據,吞吐率自然就上去了
二、CPU跑分軟件
各大CPU和服務器廠商組織了一個叫SPEC的第三方機構,專門用來指定各種"跑分"的規則
提供的CPU基准測試程序,就好像CPU屆的"高考",通過數十個不同的計算機程序,對於的性能給出一個最終評分,
三、計算機的計時單位:時鍾
雖然時間是一個很自然的用來衡量性能的指標、但是用時間來衡量時,有兩個問題
第一就是時間“不准”
第一就是時間不准 如果你隨便寫的一個程序,來統計程序運行的時間,每一次統計結果不會完全一樣。有可能這一次花了45ms,下一次變成了53ms
1、但是計算機可能同時運行着好多程序,CPU實際上不停地在各個程序之間進行切換。在這些走掉的時間里,很可能CPU切換去運行別的程序了,
2、而且,游戲程序在運行的時候,可能要從網絡、硬盤去讀取數據,要等網絡和應哦按把數據讀出來,給到內存和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執行時間編程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 多呢
[root@nfs ~]# 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所以不會遇到這個問題。