亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在2D數組上進行迭代時,嵌套循環的哪種排序更為有效

在2D數組上進行迭代時,嵌套循環的哪種排序更為有效

慕田峪7331174 2019-11-28 13:02:05
在時間(緩存性能)方面,以下哪種嵌套循環在2D數組上進行迭代更有效?為什么?int a[100][100];for(i=0; i<100; i++){   for(j=0; j<100; j++)   {       a[i][j] = 10;       }}要么for(i=0; i<100; i++){   for(j=0; j<100; j++)   {      a[j][i] = 10;       }}
查看完整描述

3 回答

?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

第一種方法稍好一些,因為分配給的像元彼此相鄰放置。


第一種方法:


[ ][ ][ ][ ][ ] ....

^1st assignment

   ^2nd assignment

[ ][ ][ ][ ][ ] ....

^101st assignment

第二種方法:


[ ][ ][ ][ ][ ] ....

^1st assignment

   ^101st assignment

[ ][ ][ ][ ][ ] ....

^2nd assignment


查看完整回答
反對 回復 2019-11-28
?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

在您的第二個代碼段中j,每次迭代中的更改都會產生一種空間局部性較低的模式。請記住,在幕后,數組引用會計算:


( ((y) * (row->width)) + (x) ) 

考慮一個簡化的L1緩存,該緩存具有足夠的空間來容納數組的50行。對于前50個迭代,您將為50個緩存未命中付出不可避免的代價,但是接下來會發生什么呢?對于從50到99的每次迭代,您仍將緩存未命中,并且必須從L2(和/或RAM等)獲取。然后,x更改為1并重新y開始,導致另一個高速緩存未命中,因為陣列的第一行已從高速緩存中逐出,依此類推。


第一個片段沒有這個問題。它以行優先的順序訪問數組,從而獲得更好的局部性-您僅需為每行最多一次(如果在循環開始時數組中的行不存在于高速緩存中)支付高速緩存未命中的費用。


話雖如此,這是一個非常依賴于體系結構的問題,因此您必須考慮細節(L1緩存大小,緩存行大小等)才能得出結論。您還應該同時衡量這兩種方式,并跟蹤硬件事件,以獲取具體的數據以得出結論。


查看完整回答
反對 回復 2019-11-28
  • 3 回答
  • 0 關注
  • 639 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號