Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么初始化一个大小为2的幂的矩阵很慢?_C_Performance_Memory - Fatal编程技术网

C 为什么初始化一个大小为2的幂的矩阵很慢?

C 为什么初始化一个大小为2的幂的矩阵很慢?,c,performance,memory,C,Performance,Memory,这让我困惑了几个星期,没有人能给出某种答案。把它当作圣诞礼物,并请张贴你可能有的任何解释 我很高兴向我的学生展示,初始化矩阵(在C中)在“按列”完成时要慢一些 借 或 差别消失了 第二个更令人费解的观察结果是,在这种情况下,不是通常的初始化效率较低。我会在“2的力量是伟大的”中填入这一点。 初始化的慢反转版本与正常版本一样快 你对此有什么看法 注意事项: 我在运行debian gcc(6.3)和clang(3.8)也会发生同样的情况 在堆或堆栈中分配似乎没有什么区别 gcc/clang的优化选

这让我困惑了几个星期,没有人能给出某种答案。把它当作圣诞礼物,并请张贴你可能有的任何解释

我很高兴向我的学生展示,初始化矩阵(在C中)在“按列”完成时要慢一些

差别消失了

第二个更令人费解的观察结果是,在这种情况下,不是通常的初始化效率较低。我会在“2的力量是伟大的”中填入这一点。 初始化的慢反转版本与正常版本一样快

你对此有什么看法

注意事项:

  • 我在运行debian

  • gcc(6.3)和clang(3.8)也会发生同样的情况

  • 在堆或堆栈中分配似乎没有什么区别

  • gcc/clang的优化选项没有什么区别(除了使两个版本更快)

  • 显然,生成的程序集没有做任何奇怪的事情(一位同事说)

  • 在较大的尺寸上,正常初始化更快。奇怪的事实是,与其他整数相比,二次幂上的反向初始化速度较慢(对于
    4096
    SIZE
    ),速度要慢25%

以下是我在测试这些东西时使用的完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>


int duration(struct timeval start, struct timeval stop) {
    return (stop.tv_sec - start.tv_sec) * 1000 + (stop.tv_usec - start.tv_usec) / 1000;
}

int *zero_square_matrix(int size, int *ms, int nb_init) {
    struct timeval start, stop;
    int *M = malloc(size*size*sizeof(int));

    gettimeofday(&start, NULL);
    int i,j;
    for(int k=0; k<nb_init; k++) {
        for (i=0; i<size; i++) {
            for (j=0; j<size; j++) {
                M[i*size + j] = 0;
            }
        }
    }
    gettimeofday(&stop, NULL);

    *ms = duration(start, stop);
    return M;

}

int *zero_square_matrix_rev(int size, int *ms, int nb_init) {
    struct timeval start, stop;
    int *M = malloc(size*size*sizeof(int));

    gettimeofday(&start, NULL);
    int i,j;
    for(int k=0; k<nb_init; k++) {
        for (i=0; i<size; i++) {
            for (j=0; j<size; j++) {
                M[j*size + i] = 0;
            }
        }
    }
    gettimeofday(&stop, NULL);

    *ms = duration(start, stop);
    return M;

}

int main(int argc, char **argv) {
    int nb_tests;
    int size;
    if (argc == 1 || argc > 3) {
        printf("usage %s SIZE [NB_TESTS]\n", argv[0]);
        return 1;
    }
    if (argc == 2) {
        size=atoi(argv[1]);
        nb_tests = 100;
    } else if (argc == 3) {
        size=atoi(argv[1]);
        nb_tests = atoi(argv[2]);
    }

    int *M;
    int ms1,ms2;
    printf("SIZE      \t\t\t  NORMAL  \t\t\t  REVERSE\n");
    for (int i=size-3; i<size+3; i+=1) {
        M = zero_square_matrix(i, &ms1, nb_tests);
        M = zero_square_matrix_rev(i, &ms2, nb_tests);
        printf("%dx%d  \t\t\t  %d  \t\t\t  %d\n", i, i, ms1, ms2);
        free(M);
    }
    return 0;
}
#包括
#包括
#包括
int持续时间(结构时间值开始,结构时间值停止){
返回(stop.tv_sec-start.tv_sec)*1000+(stop.tv_usec-start.tv_usec)/1000;
}
int*zero\u square\u矩阵(int size,int*ms,int nb\u init){
结构timeval启动、停止;
int*M=malloc(size*size*sizeof(int));
gettimeofday(&start,NULL);
int i,j;
对于(int k=0;k
 #define SIZE 512
#define SIZE 513
#define SIZE 511
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>


int duration(struct timeval start, struct timeval stop) {
    return (stop.tv_sec - start.tv_sec) * 1000 + (stop.tv_usec - start.tv_usec) / 1000;
}

int *zero_square_matrix(int size, int *ms, int nb_init) {
    struct timeval start, stop;
    int *M = malloc(size*size*sizeof(int));

    gettimeofday(&start, NULL);
    int i,j;
    for(int k=0; k<nb_init; k++) {
        for (i=0; i<size; i++) {
            for (j=0; j<size; j++) {
                M[i*size + j] = 0;
            }
        }
    }
    gettimeofday(&stop, NULL);

    *ms = duration(start, stop);
    return M;

}

int *zero_square_matrix_rev(int size, int *ms, int nb_init) {
    struct timeval start, stop;
    int *M = malloc(size*size*sizeof(int));

    gettimeofday(&start, NULL);
    int i,j;
    for(int k=0; k<nb_init; k++) {
        for (i=0; i<size; i++) {
            for (j=0; j<size; j++) {
                M[j*size + i] = 0;
            }
        }
    }
    gettimeofday(&stop, NULL);

    *ms = duration(start, stop);
    return M;

}

int main(int argc, char **argv) {
    int nb_tests;
    int size;
    if (argc == 1 || argc > 3) {
        printf("usage %s SIZE [NB_TESTS]\n", argv[0]);
        return 1;
    }
    if (argc == 2) {
        size=atoi(argv[1]);
        nb_tests = 100;
    } else if (argc == 3) {
        size=atoi(argv[1]);
        nb_tests = atoi(argv[2]);
    }

    int *M;
    int ms1,ms2;
    printf("SIZE      \t\t\t  NORMAL  \t\t\t  REVERSE\n");
    for (int i=size-3; i<size+3; i+=1) {
        M = zero_square_matrix(i, &ms1, nb_tests);
        M = zero_square_matrix_rev(i, &ms2, nb_tests);
        printf("%dx%d  \t\t\t  %d  \t\t\t  %d\n", i, i, ms1, ms2);
        free(M);
    }
    return 0;
}