ベクトルアクセスがマトリックスアクセスよりも速いかどうかを知るために、非常に単純なコードを作成しました。
私は3つのことを試しました:
1:intの100.000.000要素でベクトルを作成します。
int *matrix=(int*)malloc(sizeof(int)*100000*1000)
for(long int=x;x<100000*1000;x++)matrix[x]=1;
2:同じサイズのマトリックスを作成します。
int ** matrix=(int**)malloc(sizeof(int*)*100000);
for(long int=0; x<100000;x++){
matrix[x]=(int*)malloc(sizeof(int*)*1000);
}
for(int x=0; x<100000;x++){
for(int y=0;y<1000;y++){
matrix[x][y]=1;
}
}
3:同じベクトルを作成しますが、その中に行列として書き込みます
for(int x=0; x<100000;x++){
for(int y=0;y<1000;y++){
matrix[(x*1000)+y]=1;
}
}
常にマトリックスアクセス(CASE 2)はケース1と3の2倍かかります。ケース3はケース1よりも少し高速です。C++コンパイラ(g ++)で-O2パラメータを使用しています。
ベクトルが行列よりも速い理由は理解できます:(しかし、説明が好きです)。しかし、なぜケース3がケース1よりも速いのか理解できません。乗算プロセスによって処理が大幅に遅くなり、速くならないことを想像しました。差が0.002であっても、理由がわかりません(時間とその時間のプロセッサ使用量である可能性があります(私は想像します))
最適化せずに3つのケースすべてをコンパイルすると、ケース2の方が遅くなります。ケース3はケース1よりも遅くなります。したがって、最適化プロセスがないと、ケース1の方が速くなります。
ベクトルは、通常、より高速ですか?
ありがとう