我們先看一個(gè)例子:
有這么兩個(gè)程序:它們的目的就是將數(shù)組x中的數(shù),按照下標(biāo)累加到數(shù)組y中,最后在把數(shù)組y中的數(shù)據(jù)累加到一個(gè)數(shù)dest里面。為了驗(yàn)證效果,我們將這個(gè)過(guò)程重復(fù)10000遍。
Prog 1 Prog2
這兩個(gè)程序的區(qū)別就在Prog2中紅框里面的內(nèi)容。那么哪個(gè)程序運(yùn)行的更快呢?
話(huà)不多說(shuō),我們看實(shí)際的結(jié)果:
這里為了說(shuō)明效果,我們編譯的時(shí)候,并沒(méi)有采用優(yōu)化(編譯優(yōu)化,確實(shí)可以提高程序運(yùn)行的效率,但是過(guò)高的編譯優(yōu)化等級(jí)會(huì)有一定的副作用,另外編譯器優(yōu)化也具有一定的局限性,高效的代碼仍然應(yīng)該是我們追求的目標(biāo))??梢钥吹?,Prog2要明顯比Prog1快。
要想理解上面的例子,我們必須先介紹一下寄存器和匯編代碼的相關(guān)知識(shí):
寄存器
CPU內(nèi)部用來(lái)存放數(shù)據(jù)的一些小型存儲(chǔ)區(qū)域, 注意寄存器是在CPU內(nèi)部,受限于CPU的物理尺寸,寄存器數(shù)量不會(huì)太多。我們只需要記住兩點(diǎn):
1) 寄存器和CPU的L1 cache相比,速度雖然還在一個(gè)數(shù)量級(jí),但是L1 cache的訪(fǎng)問(wèn)速度還是要慢幾倍。具體的數(shù)據(jù)見(jiàn)下文表2
2) CPU只能從寄存器直接取數(shù)據(jù)或者指令,如果取不到,獲取的順序是L1-》L2-》L3-》主存-》磁盤(pán)。
從下文表2中可以看出,如果cpu的cache訪(fǎng)問(wèn)miss了,性能損失還是很大的。如果內(nèi)存里面再miss了,那對(duì)性能來(lái)說(shuō)不亞于一場(chǎng)災(zāi)難了。
計(jì)算機(jī)訪(fǎng)問(wèn)速度分級(jí):
表1 時(shí)間單位
以3.3GHz的CPU為例:
表2 系統(tǒng)的各種延時(shí)
正如你所見(jiàn),CPU周期的時(shí)間非常短,這段時(shí)間,光的速度大約只能走0.5米。想象一下,是不是非常震撼?
x86-64 CPU的整數(shù)寄存器:
我們無(wú)需刻意去記住這些寄存器的名稱(chēng),不同架構(gòu)的寄存器的數(shù)量和名稱(chēng)也不一樣,我們只要知道他們是cpu內(nèi)部的效率極高的存儲(chǔ)單元即可。
回到前面的例子,為什么Prog2要比Prog1快,是因?yàn)镻rog2里面用DEST這個(gè)局部變量代替了dest。DEST是一個(gè)局部變量,在匯編指令里是直接訪(fǎng)問(wèn)寄存器,而dest則需要去訪(fǎng)問(wèn)內(nèi)存cache。
-
寄存器
+關(guān)注
關(guān)注
31文章
5359瀏覽量
120807 -
cpu
+關(guān)注
關(guān)注
68文章
10890瀏覽量
212405 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3042瀏覽量
74177 -
程序
+關(guān)注
關(guān)注
117文章
3793瀏覽量
81223
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論