【C言語】
キャッシュの有無で
二次元配列参照の処理速度は
物凄く違う


■1.要するに安近短が百倍早いらしい

for(x;for(yと
for(y;for(xの処理速度を比較してみました。

■2.for(x;for(y対for(y;for(x

#include    <stdio.h>
#include    <string.h>
#include    <time.h>
#include    <assert.h>
#define     XMAX    0x1000
#define     YMAX    0x2000
char    配列A[XMAX][YMAX];
void    xy(void){
    for(int x = 0;x < XMAX ;x++){
        for(int y = 0;y < YMAX;y++){
            配列A[x][y] = 'Q';       
        }
    }
}
char    配列B[XMAX][YMAX];
void    yx(void){
    for(int y = 0;y < YMAX ;y++){
        for(int x = 0;x < XMAX ;x++){
            配列B[x][y] = 'Q';       
        }
    }
}
typedef  void (*関数ポインタ_型)(void);
static inline void    時間計測(
    char    *title,
    関数ポインタ_型     計測対象関数
){
    clock_t     start   = clock();
    for(int i = 0;i < 0x10; i++){   
        計測対象関数() ;
    }
    clock_t     end     = clock();
    printf("%s\t%10ld clock\n",title, end - start);
}
int main(void){
    時間計測("xy",xy);
    時間計測("yx",yx);
}

やっている事はどちらも
2次元配列を文字’Q’で初期化です。
違いはforループの順番です。


■3.実験結果

+ gcc -Wall -Wextra vs.c -O2
+ ./a.out
xy           62500 clock
yx         9046875 clock

筆者の環境下では
物凄く処理速度が違います。


ざっくり150倍違いました。