Cache對(duì)性能的影響首先我們要知道,CPU訪問(wèn)內(nèi)存時(shí),不是直接去訪問(wèn)內(nèi)存的,而是先訪問(wèn)緩存(cache)。
當(dāng)緩存中已經(jīng)有了我們要的數(shù)據(jù)時(shí),CPU就會(huì)直接從緩存中讀數(shù)據(jù),而不是從內(nèi)存中讀。
CPU和緩存的關(guān)系如下:
緩存分為一級(jí)、二級(jí)、三級(jí),最靠近CPU的是一級(jí)緩存,最遠(yuǎn)的是內(nèi)存,離CPU越近速度越快。
訪問(wèn)速度上,L1》L2》L3》內(nèi)存,緩存比內(nèi)存速度要快得非常多。
如果CPU操作的數(shù)據(jù)在緩存中,則直接從緩存中讀取,這個(gè)過(guò)程就叫緩存命中。
因此提升性能的關(guān)鍵,就是要提高緩存命中率。下面來(lái)看如何提高緩存命中率。
提高數(shù)據(jù)緩存命中率來(lái)看一個(gè)實(shí)例,有一個(gè)N*N的二維數(shù)組,例如:
int array[N][N];
現(xiàn)在用兩個(gè)for循環(huán)遍歷這個(gè)數(shù)組,訪問(wèn)每個(gè)元素的內(nèi)容:
for(i = 0; i 《 N; i+=1) { for(j = 0; j 《 N; j+=1) { array[i][j] = 0;//速度快
//array[j][i] = 0;//速度慢 } }
有兩種訪問(wèn)方式:array[i][j]和array[j][i]。
在性能上,array[i][j]會(huì)比array[j][i]執(zhí)行地更快,并且速度相差8倍。
1、速度更快的原因
首先數(shù)組在內(nèi)存上是連續(xù)的,假設(shè)N等于2,則array[2][2]在內(nèi)存中的排布是:
array[0][0]、array[0][1]、array[1][0]、array[1][1]、
以array[i][j]方式訪問(wèn),即按內(nèi)存中的順序訪問(wèn),當(dāng)訪問(wèn)array[0][0]時(shí),CPU就已經(jīng)把數(shù)組的剩余三個(gè)數(shù)據(jù)(array[0][1]、array[1][0]、array[1][1])加載到了緩存當(dāng)中。
當(dāng)繼續(xù)訪問(wèn)后三個(gè)元素時(shí),CPU會(huì)直接從緩存中讀取數(shù)據(jù),而不需要從內(nèi)存中讀取(cache命中)。因此速度會(huì)很快。
如果以array[j][i]方式訪問(wèn)數(shù)組,則訪問(wèn)順序?yàn)椋?/p>
array[0][0]、array[1][0]、array[0][1]、array[1][1]
此時(shí)訪問(wèn)順序是跳躍的,并不是按數(shù)組在內(nèi)存中的的排布順序來(lái)訪問(wèn)。如果N很大的話,那么執(zhí)行array[j][i]時(shí),array[j+1][i]的內(nèi)容是沒法讀進(jìn)緩存里的,等到要訪問(wèn)array[j+1][i]時(shí)就只能從內(nèi)存中讀取。
所以array[j][i]的速度會(huì)慢于array[i][j]。
2、速度相差8倍的原因
剛剛提到,如果這個(gè)二維數(shù)組的N很大,array[j+1][i]的內(nèi)容是沒法讀到緩存里的,那CPU一次能夠?qū)⒍嗌贁?shù)據(jù)加載進(jìn)緩存里呢?
這個(gè)其實(shí)跟cache line有關(guān),cache line代表緩存一次載入數(shù)據(jù)的大小。可以通過(guò)以下命令查看cache line為多大:
cat /sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size
cache line為64,代表CPU緩存一次數(shù)據(jù)的大小為64字節(jié)。
當(dāng)訪問(wèn)array[0][0]時(shí),該元素所占用的字節(jié)數(shù)不到64字節(jié),CPU就會(huì)按順序補(bǔ)足后續(xù)元素,就會(huì)把后面的array[0][1]、array[1][0]等內(nèi)容一起讀到緩存里,直到湊夠64字節(jié)。
正因如此,按順序訪問(wèn)的array[i][j]才會(huì)比不按順序訪問(wèn)的array[j][i]速度快。
再看看為什么速度相差8倍。我們知道,二維數(shù)組中,第一維元素放的是地址,第二維元素才是數(shù)據(jù)。64位系統(tǒng)中,地址占用8個(gè)字節(jié),cache
line為64的話,地址已經(jīng)占用了8字節(jié),那每個(gè)cache line最多能載入不到8個(gè)二維數(shù)組元素,N很大的情況下,他們的性能平均下來(lái)就會(huì)相差將近8倍。
結(jié)論:按內(nèi)存布局順序訪問(wèn),可以提高數(shù)據(jù)緩存命中率。
-
cpu
+關(guān)注
關(guān)注
68文章
10904瀏覽量
213023 -
Linux
+關(guān)注
關(guān)注
87文章
11345瀏覽量
210400 -
Cache
+關(guān)注
關(guān)注
0文章
129瀏覽量
28433
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Linux性能優(yōu)化大全!
NAS存儲(chǔ)系統(tǒng)性能優(yōu)化攻略
HBase性能優(yōu)化方法總結(jié)
Linux系統(tǒng)的性能優(yōu)化策略
Linux和Android系統(tǒng)故障和優(yōu)化性能的方法和流程探討
linux的性能問(wèn)題
基于Linux的Socket網(wǎng)絡(luò)編程的性能優(yōu)化
![基于<b class='flag-5'>Linux</b>的Socket網(wǎng)絡(luò)編程的<b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b>](https://file1.elecfans.com//web2/M00/A5/54/wKgZomUMN-yAaps9AAEmhQn-iPM109.jpg)
你知道linux的cache memory?
Linux CPU的性能應(yīng)該如何優(yōu)化
Linux內(nèi)核文件Cache機(jī)制
![<b class='flag-5'>Linux</b>內(nèi)核文件<b class='flag-5'>Cache</b>機(jī)制](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
cache的排布與CPU的典型分布
Cache與性能優(yōu)化精彩問(wèn)答38條
影響Linux性能的因素與優(yōu)化方法
Linux內(nèi)核slab性能優(yōu)化的核心思想
![<b class='flag-5'>Linux</b>內(nèi)核slab<b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b>的核心思想](https://file1.elecfans.com/web2/M00/AF/B9/wKgZomVRm7CAZLMyAAIDou_e_HI165.jpg)
評(píng)論