[問題] 陣列運算速度問題

看板C_and_CPP作者 (藍廳)時間9年前 (2016/02/21 00:08), 編輯推噓4(4011)
留言15則, 5人參與, 最新討論串1/1
請教一下各位大大 最近有看到一個說法是C/C++在處理陣列時 用指標表示比用陣列表示的速度快 例如A,B是兩個大小M*N的二維double陣列 他們的型態是(double*)[N] 假設我要讓B陣列的元素值為A陣列對應位置的元素的兩倍 有以下作法 for(I=0;I<M;I++) for(J=0;J<N;J++) B[I][J]=2*A[I][J]; 或 for(I=0;I<M;I++) for(J=0;J<N;J++) *(*(B+I)+J)=2*(*(*(A+I)+J)); 或可令double *ptr1=&A[0][0],*ptr2=&B[0][0] for(I=0;I<M*N;I++) *(ptr1+I)=2*(*(ptr2+I)); 請問這幾種寫法的運算速度會有明顯差別嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.230.213.146 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1455984512.A.522.html

02/21 00:36, , 1F
明顯差別一定是不可能的啦,除非拿很慢很慢的CPU來跑
02/21 00:36, 1F

02/21 00:46, , 2F
因為我之後處理很大的陣列,所以還是想知道哪種寫
02/21 00:46, 2F

02/21 00:46, , 3F
法才是最好的@@
02/21 00:46, 3F

02/21 00:51, , 4F
不會,因*(ptr + n)與ptr[n]在x86組合語言都是一樣的
02/21 00:51, 4F

02/21 00:53, , 5F
題外話,這除了改善演算法,也要注意cache friendly
02/21 00:53, 5F

02/21 00:54, , 6F
總之,*(ptr+n)的速度與p[n]完全相同
02/21 00:54, 6F

02/21 00:57, , 7F
感謝大大回答,再弱弱的問一下cache friendly是@@?
02/21 00:57, 7F

02/21 01:11, , 8F
手邊沒電腦手機不好打字,這講起來有點篇幅。所以自己查
02/21 01:11, 8F

02/21 01:11, , 9F
資料,或等其他高手講解。再補充一個,可以用SIMD加速
02/21 01:11, 9F

02/21 01:14, , 10F
不過聽說GCC開優化會自己加MMX,所以應該不用手動寫就是
02/21 01:14, 10F

02/21 01:14, , 11F
02/21 01:14, 11F

02/21 01:24, , 12F
可用 -ftree-vectorizer-verbose=5 檢查是否有成功被
02/21 01:24, 12F

02/21 01:25, , 13F
套用了 Auto-vectorization
02/21 01:25, 13F

02/21 01:30, , 14F
另外 cache friendly 可看看這篇 http://goo.gl/W0bJ9j
02/21 01:30, 14F

02/21 10:17, , 15F
這種問題你自己寫測試就知道
02/21 10:17, 15F
文章代碼(AID): #1Mo8-0KY (C_and_CPP)