[問題] array的定義放迴圈裡面或外面比較有效率?

看板C_and_CPP (C/C++)作者 (快樂就好)時間11年前 (2014/12/17 11:35), 11年前編輯推噓3(3018)
留言21則, 6人參與, 最新討論串1/1
問題: 考量程式的效率或其他層面, array 或 vector 的定義放在迴圈裡面比較好還是外面比較好? 譬如: 我有一個array在每loop一次之前需要重新歸零,哪個做法比較好? ps. 我不是資工相關背景 for(int n=0; n < N; n++) { double array[500]={0.0}; ... ... ... } double array[500] for(int n=0; n < N; n++) { memset(array, 0.0, 500*sizeof(double)); // 歸零 ... ... ... } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.109.103.203 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1418787305.A.A6F.html ※ 編輯: eagle32 (140.109.103.203), 12/17/2014 11:36:21

12/17 11:47, , 1F
如果compiler處理得好,兩者效率會差不多
12/17 11:47, 1F

12/17 13:29, , 2F
你測過執行時間了嗎
12/17 13:29, 2F

12/17 13:42, , 3F
locality 二維或多維陣列比較容易出問題 一維陣列就
12/17 13:42, 3F

12/17 13:42, , 4F
推一樓
12/17 13:42, 4F

12/17 15:37, , 5F
沒有測過時間. 想說也許只要觀念正確答案應該是很明顯的.
12/17 15:37, 5F

12/17 15:38, , 6F
locality是什麼? 重要嗎?
12/17 15:38, 6F

12/17 16:03, , 7F
locality of reference指的是存取各筆資料在記憶體的
12/17 16:03, 7F

12/17 16:04, , 8F
相鄰性,在同一個cache line的相鄰資料會同時被載入到
12/17 16:04, 8F

12/17 16:05, , 9F
快取記憶體,加速軟體方的存取速度
12/17 16:05, 9F

12/17 16:06, , 10F
所以以線性方式存取資料,會比隨機存取資料有效率
12/17 16:06, 10F

12/17 16:07, , 11F
這也是為什麼 for(i=0~N)for(j=0~N)array2D[i][j]
12/17 16:07, 11F

12/17 16:08, , 12F
的寫法會比 for(i=0~N)for(j=0~N)array2D[j][i] 理想
12/17 16:08, 12F

12/17 16:10, , 13F
locality挺重要,寫程式的同時最好謹記這個概念
12/17 16:10, 13F

12/17 16:11, , 14F
囉嗦完了,你用的是一維陣列,看起來也是在for迴圈裏面
12/17 16:11, 14F

12/17 16:12, , 15F
存取,能夠線性存取就線性存取
12/17 16:12, 15F

12/17 16:26, , 16F
謝謝你們的指教 我沒有樓上講的觀念
12/17 16:26, 16F

12/17 16:29, , 17F
你說的線性存取就是順著記憶體位置讀取 避免跳來跳去對吧
12/17 16:29, 17F

12/17 16:31, , 18F
通常我需要塞一個多維的array 或 vector 到迴圈裡面
12/17 16:31, 18F

12/18 13:13, , 19F
測試也很重要,即使觀念讓你認為第2種效率較好,但是好多少呢?
12/18 13:13, 19F

12/18 13:14, , 20F
若只好一點點,對你整體程式影響幾乎可忽略,那應考選擇維護上
12/18 13:14, 20F

12/18 13:14, , 21F
比較好的
12/18 13:14, 21F
文章代碼(AID): #1KaFdffl (C_and_CPP)
文章代碼(AID): #1KaFdffl (C_and_CPP)