国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

深入計算機系統(tǒng)看性能優(yōu)化

這篇具有很好參考價值的文章主要介紹了深入計算機系統(tǒng)看性能優(yōu)化。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一.引言

“性能優(yōu)化”,從計算機誕生之初就一直伴隨著計算機技術(shù)的發(fā)展,直到現(xiàn)在。將來也必定不會消失。這是因為每個人都會追求性價比,花最少的錢,辦最多的事。生活中也一樣,就比如說泡茶,但凡有點常識的人都不會先洗茶杯,再去燒水,而是先去燒水,在等水開的過程中,去做洗茶杯等工作。這也是一種優(yōu)化。

本篇嘗試帶大家從計算機系統(tǒng)的角度,簡單介紹一下幾種性能優(yōu)化的原理和方法,拋磚引玉,供大家參考。

二.訪問寄存器代替內(nèi)存引用

我們先看一個例子:

有這么兩個程序:它們的目的就是將數(shù)組x中的數(shù),按照下標(biāo)累加到數(shù)組y中,最后在把數(shù)組y中的數(shù)據(jù)累加到一個數(shù)dest里面。為了驗證效果,我們將這個過程重復(fù)10000遍。

深入計算機系統(tǒng)看性能優(yōu)化,性能優(yōu)化

? ? ? ? ? ? ? ? ? ??? Prog 1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ?Prog2

這兩個程序的區(qū)別就在Prog2中紅框里面的內(nèi)容。那么哪個程序運行的更快呢?

話不多說,我們看實際的結(jié)果:

深入計算機系統(tǒng)看性能優(yōu)化,性能優(yōu)化

深入計算機系統(tǒng)看性能優(yōu)化,性能優(yōu)化

這里為了說明效果,我們編譯的時候,并沒有采用優(yōu)化(編譯優(yōu)化,確實可以提高程序運行的效率,但是過高的編譯優(yōu)化等級會有一定的副作用,另外編譯器優(yōu)化也具有一定的局限性,高效的代碼仍然應(yīng)該是我們追求的目標(biāo))??梢钥吹剑琍rog2要明顯比Prog1快。

要想理解上面的例子,我們必須先介紹一下寄存器和匯編代碼的相關(guān)知識:

1.寄存器

CPU內(nèi)部用來存放數(shù)據(jù)的一些小型存儲區(qū)域, 注意寄存器是在CPU內(nèi)部,受限于CPU的物理尺寸,寄存器數(shù)量不會太多。我們只需要記住兩點:

1) ?寄存器和CPU的L1 cache相比,速度雖然還在一個數(shù)量級,但是L1 cache的訪問速度還是要慢幾倍。具體的數(shù)據(jù)見下文表2

2) ?CPU只能從寄存器直接取數(shù)據(jù)或者指令,如果取不到,獲取的順序是L1->L2->L3->主存->磁盤。

從下文表2中可以看出,如果cpu的cache訪問miss了,性能損失還是很大的。如果內(nèi)存里面再miss了,那對性能來說不亞于一場災(zāi)難了。

計算機訪問速度分級:

表1 ?時間單位

深入計算機系統(tǒng)看性能優(yōu)化,性能優(yōu)化

以3.3GHz的CPU為例:

表2 ?系統(tǒng)的各種延時

深入計算機系統(tǒng)看性能優(yōu)化,性能優(yōu)化

正如你所見,CPU周期的時間非常短,這段時間,光的速度大約只能走0.5米。想象一下,是不是非常震撼?

x86-64 CPU的整數(shù)寄存器:

深入計算機系統(tǒng)看性能優(yōu)化,性能優(yōu)化

我們無需刻意去記住這些寄存器的名稱,不同架構(gòu)的寄存器的數(shù)量和名稱也不一樣,我們只要知道他們是cpu內(nèi)部的效率極高的存儲單元即可。

回到前面的例子,為什么Prog2要比Prog1快,是因為Prog2里面用DEST這個局部變量代替了*dest。DEST是一個局部變量,在匯編指令里是直接訪問寄存器,而*dest則需要去訪問內(nèi)存cache。

2.匯編代碼簡介

說到匯編語言的產(chǎn)生,首先要講一下機器語言。機器語言是機器指令的集合。機器指令展開來講就是一臺機器可以正確執(zhí)行的命令。電子計算機的機器指令是一列二進(jìn)制數(shù)字。計算機將之轉(zhuǎn)變?yōu)橐涣懈叩碗娖?,以使計算機的電子器件受到驅(qū)動,進(jìn)行運算。

上面所說的計算機指的是可以執(zhí)行機器指令,進(jìn)行運算的機器。這是早期計算機的概念。在我們常用的PC機中,有一個芯片來完成上面所說的計算機的功能。這個芯片就是我們常說的CPU(Central Processing Unit,中央處理單元)。每一種微處理器,由于硬件設(shè)計和內(nèi)部結(jié)構(gòu)的不同,就需要用不同的電平脈沖來控制,使它工作。所以每一種微處理器都有自己的機器指令集,也就是機器語言。

早期的程序設(shè)計均使用機器語言。程序員們將用0, 1數(shù)字編成的程序代碼打在紙帶或卡片上,1打孔,0不打孔,再將程序通過紙帶機或卡片機輸入計算機,進(jìn)行運算。這樣的機器語言由純粹的0和1構(gòu)成,十分復(fù)雜,不方便閱讀和修改,也容易產(chǎn)生錯誤。

深入計算機系統(tǒng)看性能優(yōu)化,性能優(yōu)化

程序員們很快就發(fā)現(xiàn)了使用機器語言帶來的麻煩(何止是麻煩,簡直令人發(fā)狂),它們難于辨別和記憶,給整個產(chǎn)業(yè)的發(fā)展帶來了障礙,于是匯編語言產(chǎn)生了。

匯編語言的主體是匯編指令。匯編指令和機器指令的差別在于指令的表示方法上。匯編指令是機器指令便于記憶的書寫格式。

我們舉個例子看下:

源代碼:

深入計算機系統(tǒng)看性能優(yōu)化,性能優(yōu)化

匯編代碼和機器碼:

深入計算機系統(tǒng)看性能優(yōu)化,性能優(yōu)化

可以看到匯編代碼,好歹還有幾個能猜出意思的單詞。

有沒有覺得現(xiàn)在的程序員還是挺幸福的。

3.匯編指令簡介

匯編語言是計算機語言的一種,是一種低級語言。相比高級語言,匯編語言更接近底層硬件,使用更加直接,效率更高。但相對而言,匯編語言更加復(fù)雜,語法更加嚴(yán)格。

  • 操作數(shù)指示符:

大多數(shù)指令有一個或多個操作數(shù),指示出執(zhí)行一個操作中要使用的源數(shù)據(jù)值。

操作數(shù)一般可以分為三類:

立即數(shù)

寄存器

內(nèi)存引用

深入計算機系統(tǒng)看性能優(yōu)化,性能優(yōu)化

  • 數(shù)據(jù)傳送指令:

最頻繁使用的指令,負(fù)責(zé)將數(shù)據(jù)從一個位置復(fù)制到另一個位置。

例如:

mov %rbx, %rax ?: 將rbx寄存器的值移動到rax寄存器

mov %rbx, (%rax) : 將rbx寄存器的值移動到rax寄存器所表示的內(nèi)存地址中

以及mov指令的一些擴展指令: movb, movw, movl, movq等等

  • 壓入和彈出棧數(shù)據(jù)

將數(shù)據(jù)壓入程序棧中,以及從程序棧中彈出數(shù)據(jù)。

push %rbp : 將%rbp寄存器的值壓入程序棧指針指向的位置

pop %rbp : 將棧指針指向的數(shù)據(jù)彈出,放入%rbp寄存器

  • 算數(shù)和邏輯操作

深入計算機系統(tǒng)看性能優(yōu)化,性能優(yōu)化

  • 跳轉(zhuǎn)指令

導(dǎo)致執(zhí)行切換到程序中一個全新的位置

jmp %rax 用寄存器%rax中的值作為跳轉(zhuǎn)目標(biāo)

jmp是無條件跳轉(zhuǎn),還有一些條件跳轉(zhuǎn)指令,有興趣的同學(xué)可以查一下資料。

  • 比較和測試指令

比較指令CMP,只設(shè)置條件碼,不更新目的寄存器,其余的行為和SUB指令一致

測試指令TEST,只設(shè)置條件碼,不更新目的寄存器,其余的行為和ADD指令一致

更多詳細(xì)的內(nèi)容,可以通過相關(guān)書籍進(jìn)行系統(tǒng)性的了解,鑒于篇幅,就不多介紹了。

讓我們回到剛才的例子,可以看到由于把內(nèi)存引用替換成了訪問寄存器,程序性能就有了明顯的提升。

三.幫助提高CPU分支跳轉(zhuǎn)的正確率

我們還是先看一個例子:

深入計算機系統(tǒng)看性能優(yōu)化,性能優(yōu)化

看上面的兩個函數(shù),它們都是calloc一個全零數(shù)組x(這里不能直接用數(shù)組賦值,否則編譯器會足夠聰明進(jìn)行自動的優(yōu)化),遍歷x中的每個數(shù),如果等于0,執(zhí)行分支A,否則執(zhí)行分支B。

唯一的不同就是在分支判斷的時候,prog2.c加了likely。我們先看下實際的結(jié)果如何:

深入計算機系統(tǒng)看性能優(yōu)化,性能優(yōu)化

深入計算機系統(tǒng)看性能優(yōu)化,性能優(yōu)化

可以看出,加了likely的prog2,明顯用時變短。原因何在?

為了理解上面的例子,我們先介紹CPU流水線相關(guān)知識:

3.1. CPU流水線簡介

CPU流水線是一種使用多級緩存來提高處理器性能的技術(shù)。它是指將CPU操作分為多個階段,每個階段單獨完成一個操作,然后將結(jié)果傳遞給下一個階段,以此類推。每個階段都有一個獨立的部件,并且所有部件都能同時處理不同的指令。現(xiàn)代CPU都會采用這種技術(shù)來提高CPU的運行效率。

CPU流水線通常包括以下五個階段:

1)取指令(Instruction fetch):從存儲器中讀取指令。

2)指令譯碼(Instruction decode):將指令轉(zhuǎn)換為可執(zhí)行的指令。

3)執(zhí)行指令(Instruction execute):執(zhí)行指令的操作。

4)寫回(Write back):將執(zhí)行指令得到的結(jié)果寫回內(nèi)存中。

5)更新程序計數(shù)器(Update program counter):將程序計數(shù)器加1,使它指向下一個指令。

舉個簡單的例子:

我們假設(shè)每一個步驟執(zhí)行時間都是一個時鐘周期,那么一條指令執(zhí)行需要3個時鐘周期

深入計算機系統(tǒng)看性能優(yōu)化,性能優(yōu)化

CPU 執(zhí)行指令的3個時鐘周期里,取值單元只在第一個時鐘周期里工作,其余兩個時鐘周期都處于空閑狀態(tài),其它兩個執(zhí)行單元也是如此,效率太低了。

解決方法就是引入流水線,引入流水線工作模式后可以看到,除了剛開始第一個時鐘周期大家還可以偷懶外,其余的時間都不會閑著

深入計算機系統(tǒng)看性能優(yōu)化,性能優(yōu)化

CPU流水線的優(yōu)點是可以同時執(zhí)行多個指令,從而提高了處理器的效率。但它也存在一些問題,例如數(shù)據(jù)相關(guān)性(Data dependency)和控制相關(guān)性(Control dependency),這些問題可能導(dǎo)致流水線停滯,降低CPU的性能。

執(zhí)行的程序指令如果是順序結(jié)構(gòu),沒有中斷或跳轉(zhuǎn),流水線確實可以提高執(zhí)行效率。但是當(dāng)程序指令中存在跳轉(zhuǎn)、分支結(jié)構(gòu)時,下面預(yù)取的指令可能就要全部丟掉了,需要到要跳轉(zhuǎn)的地方重新取指令執(zhí)行。一般來說分支預(yù)測錯誤的處罰大約是19個時鐘周期。(具體計算方法這里不做詳細(xì)介紹了)。

我們看下前面提到的例子匯編出來的結(jié)果:

深入計算機系統(tǒng)看性能優(yōu)化,性能優(yōu)化

prog2,這里匯編是”jne”,意思是如果判斷結(jié)果不為0,就跳轉(zhuǎn)到地址 800 的地方執(zhí)行。我們知道這里的判斷一直是0。所以,cpu指令順序向下執(zhí)行,并不會發(fā)生預(yù)判錯誤,預(yù)取的指令也不會丟棄。這樣就不會遭到分支預(yù)測錯誤的懲罰,效率會提高。

所以有些情況下,當(dāng)我們根據(jù)實際的情況可以判斷出哪條分支的可能性更高的時候,我們就可以站在上帝視角給予一定的提示,這樣就可以降低分支預(yù)測錯誤,減少CPU的無用功了,從而可以有效的提高性能,同時也節(jié)省了功耗。

四.總結(jié)

從計算機系統(tǒng)的角度來看,性能優(yōu)化的幾個思考方向:

1. 盡可能高效的獲取數(shù)據(jù)

2. 盡可能減少CPU的無用功。

3. 盡可能在有限的時間內(nèi),讓CPU干更多的有效的事情。

4. 完成同樣的工作任務(wù),盡可能的讓CPU少做事。

參考資料:

1.《深入理解計算機系統(tǒng)》作者:【美】蘭德爾E.布萊恩特 【美】大衛(wèi)R.奧哈拉倫

2.《性能之巔》作者:【美】 Brendan Gregg

3. CSND博客:宋寶華:深入理解cache對寫好代碼至關(guān)重要

超詳細(xì)!Linux內(nèi)核內(nèi)存規(guī)整詳解

關(guān)于Ultra HDR Image的那些事

多圖文教你看懂單個圖層的繪制流程

深入計算機系統(tǒng)看性能優(yōu)化,性能優(yōu)化

長按關(guān)注內(nèi)核工匠微信

Linux內(nèi)核黑科技|?技術(shù)文章|?精選教程文章來源地址http://www.zghlxwxcb.cn/news/detail-761528.html

到了這里,關(guān)于深入計算機系統(tǒng)看性能優(yōu)化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包