性能的基本理解:為什么順序執(zhí)行一個(gè)操作,要比并發(fā)執(zhí)行效率更低?tps更差?

發(fā)布時(shí)間:2022-09-06

最近一個(gè)客戶提問(wèn)說(shuō),我的系統(tǒng)順序執(zhí)行不是也很快嘛,為什么要并發(fā)來(lái)執(zhí)行呢?
 
這個(gè)問(wèn)題初看很簡(jiǎn)單,我仔細(xì)想了一下,其實(shí)不太容易回答,尤其是現(xiàn)在高級(jí)語(yǔ)言越來(lái)越多,導(dǎo)致開(kāi)發(fā)人員對(duì)系統(tǒng)的理解比較困難。其實(shí)就是對(duì)系統(tǒng)的性能理解存在很多偏差。
 
第一個(gè)問(wèn)題,程序執(zhí)行時(shí)間,是如何來(lái)計(jì)算的?我們知道,當(dāng)前的系統(tǒng)幾乎都是馮諾依曼架構(gòu)的,它順序的執(zhí)行指令(也就是程序編譯完成的結(jié)果),來(lái)完成一個(gè)一個(gè)的功能。每一條指令,執(zhí)行的時(shí)候,都包含了幾個(gè)時(shí)鐘周期。比如,一個(gè)指令可能包含1個(gè)時(shí)鐘周期,也可能包含多個(gè)。所謂時(shí)鐘,就是我們經(jīng)常看到的,你的電腦的主頻,其實(shí)是cpu主頻,是多少G的,就是一秒鐘有多少個(gè)時(shí)鐘周期。假設(shè)你的代碼要執(zhí)行5萬(wàn)條指令,平均每條指令有2個(gè)時(shí)鐘周期,那么執(zhí)行完成這一段代碼,就需要10萬(wàn)個(gè)時(shí)鐘周期,再根據(jù)主頻,我們就能夠知道,需要多少時(shí)間了。
 
第二個(gè)問(wèn)題,為什么并發(fā)執(zhí)行速度更快?其實(shí)有幾個(gè)原因:1)我們的cpu是多內(nèi)核多線程的。每個(gè)線程可以獨(dú)立執(zhí)行一個(gè)指令序列。比如16線程的cpu,可以同時(shí)執(zhí)行16段代碼,如果你的代碼只允許單個(gè)執(zhí)行,那么只使用了1個(gè)線程,其他的15個(gè)在“休息”,當(dāng)然不夠快。如果你讓它同時(shí)跑16并發(fā),肯定能夠得到更快的執(zhí)行速度。2)操作系統(tǒng)調(diào)度。我們知道,當(dāng)執(zhí)行代碼的時(shí)候,比如你遇到一個(gè)通訊代碼,要從一個(gè)“句柄”中讀取信息,那么這個(gè)程序就會(huì)陷入等待狀態(tài),操作系統(tǒng)就會(huì)“掛起”它,直到這個(gè)信息發(fā)過(guò)來(lái),觸發(fā)了一個(gè)“中斷”,來(lái)喚醒了這個(gè)代碼,讓它繼續(xù)執(zhí)行。當(dāng)代碼被掛起,其實(shí)操作系統(tǒng)就可以安排其他的程序進(jìn)來(lái)執(zhí)行。所以,雖然你的cpu有16線程,但是它可以執(zhí)行更多的并發(fā)。
 
第三個(gè)問(wèn)題,為什么有的代碼,看起來(lái)長(zhǎng)度差不多,但是卻很慢?我們知道,程序代碼如果使用了“系統(tǒng)調(diào)用”,那么其實(shí)這個(gè)功能是操作系統(tǒng)提供的,會(huì)進(jìn)入操作系統(tǒng)的另外一個(gè)狀態(tài),導(dǎo)致執(zhí)行了一大堆你看不到的代碼。如果你的代碼沒(méi)有系統(tǒng)調(diào)用,原則上可以比使用系統(tǒng)調(diào)用的代碼跑的更快。舉個(gè)例子,比如你的代碼用到了動(dòng)態(tài)內(nèi)存,這個(gè)內(nèi)存從哪里來(lái)呢?從操作系統(tǒng)的“堆”來(lái),那么就要去操作系統(tǒng)的“堆”申請(qǐng)一片內(nèi)存。如果你想讓它很快,那么你可以開(kāi)一片大的內(nèi)存在本程序內(nèi),一般使用局部變量。局部變量開(kāi)在哪里?一般在“棧”里面。你會(huì)發(fā)現(xiàn),性能提升了非常多。
 
以上,我們解釋了,程序執(zhí)行占用cpu和時(shí)間的問(wèn)題,以及為什么并發(fā)執(zhí)行的代碼往往會(huì)效率更高。當(dāng)然,如果你的并發(fā)設(shè)置的過(guò)高,也會(huì)起反作用:由于cpu線程的頻繁調(diào)度導(dǎo)致性能下降。
 
下面我們說(shuō)一下,如何優(yōu)化代碼。首先,要優(yōu)化單個(gè)代碼的執(zhí)行速度,就是縮短執(zhí)行時(shí)間。比如,一段代碼原來(lái)執(zhí)行一次,需要2秒。如果你優(yōu)化到0.2秒(就是200毫秒),那么速度就提升了10倍。代碼優(yōu)化,主要的就是算法,減少指令執(zhí)行條數(shù),避免循環(huán)嵌套、甚至循環(huán)展開(kāi)。技術(shù)手段很多,有興趣可以自己搜索研究。
 
當(dāng)單個(gè)的代碼執(zhí)行速度提升,我們就可以通過(guò)性能測(cè)試工具(比如澤眾performanceRunner性能測(cè)試工具)來(lái)并發(fā)執(zhí)行,看看在大并發(fā)之下,會(huì)不會(huì)由于資源沖突或者競(jìng)爭(zhēng)導(dǎo)致的性能急速下降。單獨(dú)執(zhí)行速度快的代碼,也可能在一定并發(fā)到達(dá)之后,忽然慢下來(lái)的。比如,你的數(shù)據(jù)庫(kù)沒(méi)有索引。
 
這篇文章的目的是幫助我們理解,什么是性能,從cpu和指令的角度看,如何看待執(zhí)行速度。
 
推薦閱讀:
 
 
 
 
 
本文內(nèi)容不用于商業(yè)目的,如涉及知識(shí)產(chǎn)權(quán)問(wèn)題,請(qǐng)權(quán)利人聯(lián)系SPASVO小編(021-60725088-8054),我們將立即處理,馬上刪除。
滬ICP備07036474號(hào) 2003-2024 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd.
微信
咨詢

添加客服微信 歡迎咨詢測(cè)試工具和測(cè)試服務(wù)

微信客服
問(wèn)題
反饋
產(chǎn)品
畫(huà)冊(cè)

掃描二維碼下載澤眾軟件企業(yè)宣傳冊(cè)

產(chǎn)品畫(huà)冊(cè)
返回
頂部

方案咨詢

×
提交信息

電話咨詢,400-035-7887,安排專業(yè)技術(shù)售前給您解答(產(chǎn)品試用、技術(shù)交流、服務(wù)咨詢和商務(wù)報(bào)價(jià))。

您的信息已成功提交!

我們的客服人員稍后會(huì)與您聯(lián)系