看板 C_and_CPP 關於我們 聯絡資訊
問題: 考量程式的效率或其他層面, 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
tjjh89017: 如果compiler處理得好,兩者效率會差不多 12/17 11:47
loveme00835: 你測過執行時間了嗎 12/17 13:29
longlongint: locality 二維或多維陣列比較容易出問題 一維陣列就 12/17 13:42
longlongint: 推一樓 12/17 13:42
eagle32: 沒有測過時間. 想說也許只要觀念正確答案應該是很明顯的. 12/17 15:37
eagle32: locality是什麼? 重要嗎? 12/17 15:38
cjcat2266: locality of reference指的是存取各筆資料在記憶體的 12/17 16:03
cjcat2266: 相鄰性,在同一個cache line的相鄰資料會同時被載入到 12/17 16:04
cjcat2266: 快取記憶體,加速軟體方的存取速度 12/17 16:05
cjcat2266: 所以以線性方式存取資料,會比隨機存取資料有效率 12/17 16:06
cjcat2266: 這也是為什麼 for(i=0~N)for(j=0~N)array2D[i][j] 12/17 16:07
cjcat2266: 的寫法會比 for(i=0~N)for(j=0~N)array2D[j][i] 理想 12/17 16:08
cjcat2266: locality挺重要,寫程式的同時最好謹記這個概念 12/17 16:10
cjcat2266: 囉嗦完了,你用的是一維陣列,看起來也是在for迴圈裏面 12/17 16:11
cjcat2266: 存取,能夠線性存取就線性存取 12/17 16:12
eagle32: 謝謝你們的指教 我沒有樓上講的觀念 12/17 16:26
eagle32: 你說的線性存取就是順著記憶體位置讀取 避免跳來跳去對吧 12/17 16:29
eagle32: 通常我需要塞一個多維的array 或 vector 到迴圈裡面 12/17 16:31
kwpn: 測試也很重要,即使觀念讓你認為第2種效率較好,但是好多少呢? 12/18 13:13
kwpn: 若只好一點點,對你整體程式影響幾乎可忽略,那應考選擇維護上 12/18 13:14
kwpn: 比較好的 12/18 13:14