評價: 3 回應: 1 閱覽: 222
置頂

陣列運算速度問題

請教一下板上各位大大

最近有看到一個說法是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));

請問這幾種寫法的運算速度會有明顯差別嗎?

熱門回應

不會,因*(ptr + n)與ptr[n]在x86組合語言都是一樣的

題外話,這除了改善演算法,也要注意cache friendly

總之,*(ptr+n)的速度與p[n]完全相同

再補充一個,可以用SIMD加速

不過聽說GCC開優化會自己加MMX

所以應該不用手動寫就是了

 

會員登入 (先登入會員才能回覆留言喔!)

Facebook留言