轉(zhuǎn)載:點(diǎn)擊打開鏈接 作者:chen825919148
1.8.2,循環(huán)語句的注意點(diǎn)
【建議1-27】在多重循環(huán)中,如果有可能,應(yīng)當(dāng)將最長的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層,以減少CPU跨切循環(huán)層的次數(shù)。
例如:
************************************以上是原文************************************
其實(shí),右邊的循環(huán)之所以比左邊的效率高,本質(zhì)原因并非是循環(huán)長短的問題,而是與程序訪問的局部性和Cache命中率有關(guān)。計(jì)算機(jī)專業(yè)畢業(yè)的學(xué)生應(yīng)該很清楚這個(gè)問題,在《操作系統(tǒng)》和《體系結(jié)構(gòu)》課程中一般都會(huì)探討此問題。我們知道,數(shù)組在計(jì)算機(jī)中是行優(yōu)先存儲(chǔ)的(即本行的最后一個(gè)元素與下一行的第一個(gè)元素地址相鄰),左邊的循環(huán)中,依次訪問的是變量a[0][0],a[1][0],a[2][0],……,a[99][0],a[0][1],a[1][1],a[2][1],……,a[99][1],……這實(shí)際上是按照列優(yōu)先的原則在訪問數(shù)組元素。如果Cache容量相對(duì)于數(shù)組容量而言不夠大,考慮一個(gè)極端情況,假設(shè)Cache只有一個(gè)塊,只能存儲(chǔ)一行數(shù)據(jù),則每訪問一個(gè)元素就會(huì)發(fā)生一次Cache失效,就需要訪問一次主存,讀入一塊數(shù)據(jù),導(dǎo)致存儲(chǔ)系統(tǒng)效率低下,明顯影響操作延遲。而右邊的循環(huán)采用的是行優(yōu)先訪問原則,與元素存儲(chǔ)順序一致。基于同樣的假設(shè),此時(shí)只有訪問新一行的第一個(gè)數(shù)據(jù)時(shí)才發(fā)生Cache失效,通過訪問主存讀入一塊連續(xù)的數(shù)據(jù)(恰為數(shù)組的一行),此后訪問同行數(shù)據(jù)便可直接使用Cache中緩存的數(shù)據(jù),直到訪問下一行的第一個(gè)數(shù)據(jù)。Cache失效率降低了,整個(gè)存儲(chǔ)系統(tǒng)的平均訪問延遲降低了,顯然程序執(zhí)行效率較高。
內(nèi)外循環(huán)交換是優(yōu)化程序性能的重要手段之一,右邊程序的存儲(chǔ)訪問局部性較好,建議如此編程。
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注