分享一道360的C語言筆試題。x是一個行列均為1000的二維數(shù)組,下面代碼運(yùn)行效率最高的是哪個?
二維數(shù)組大家都很熟悉,正常人遍歷二維數(shù)組都是一行一行來的,為什么很少有人按列去遍歷?
這道筆試題其實(shí)考察的就是遍歷效率的問題。
選項(xiàng)A,j是行,i是列,很顯然 x[i][j] 是按列訪問,先是第一列第一個元素,然后第一列第二個元素,以此類推。
選項(xiàng)B和選項(xiàng)C都存在按列訪問。
只有選項(xiàng)D,屬于正常的按行遍歷。
那么問題來了,為什么二維數(shù)組按行遍歷比按列遍歷來的快?
這個涉及的問題就太多了,得從CPU高速緩存講起。
CPU處理速度很快,但是訪問內(nèi)存太慢,嚴(yán)重影響了機(jī)器運(yùn)行效率。
于是就出現(xiàn)了高速緩存。
從名字應(yīng)該能看出,訪問它速度確實(shí)快。
當(dāng)CPU發(fā)出內(nèi)存訪問請求時,會首先查看緩存內(nèi)是否有請求的數(shù)據(jù),如果有,直接返回,如果沒有,就要先把內(nèi)存中的數(shù)據(jù)載入緩存,再把它返回給處理器。
由于緩存比內(nèi)存貴很多,所以它的大小一般都以KB或者M(jìn)B為單位,如果是一級緩存,那就更小了。
題目中的二維數(shù)組大小接近4M,CPU在訪問的時候,緩存先從內(nèi)存抓取數(shù)據(jù),而且一般都是抓取相鄰整個數(shù)據(jù)塊,簡單點(diǎn)理解,就是當(dāng)前行以及后面的部分?jǐn)?shù)據(jù),這也符合內(nèi)存訪問局部性特征。
如果二維數(shù)組按列遍歷,就需要不斷的抓取內(nèi)存的數(shù)據(jù),降低程序效率,這也將會失去緩存的意義。
審核編輯:劉清
-
處理器
+關(guān)注
關(guān)注
68文章
19825瀏覽量
233747 -
cpu
+關(guān)注
關(guān)注
68文章
11049瀏覽量
216144 -
C語言
+關(guān)注
關(guān)注
180文章
7630瀏覽量
140557
原文標(biāo)題:為什么二維數(shù)組都是一行一行訪問?
文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
評論