C 为什么初始化一个大小为2的幂的矩阵很慢?
这让我困惑了几个星期,没有人能给出某种答案。把它当作圣诞礼物,并请张贴你可能有的任何解释 我很高兴向我的学生展示,初始化矩阵(在C中)在“按列”完成时要慢一些 借 或 差别消失了 第二个更令人费解的观察结果是,在这种情况下,不是通常的初始化效率较低。我会在“2的力量是伟大的”中填入这一点。 初始化的慢反转版本与正常版本一样快 你对此有什么看法 注意事项:C 为什么初始化一个大小为2的幂的矩阵很慢?,c,performance,memory,C,Performance,Memory,这让我困惑了几个星期,没有人能给出某种答案。把它当作圣诞礼物,并请张贴你可能有的任何解释 我很高兴向我的学生展示,初始化矩阵(在C中)在“按列”完成时要慢一些 借 或 差别消失了 第二个更令人费解的观察结果是,在这种情况下,不是通常的初始化效率较低。我会在“2的力量是伟大的”中填入这一点。 初始化的慢反转版本与正常版本一样快 你对此有什么看法 注意事项: 我在运行debian gcc(6.3)和clang(3.8)也会发生同样的情况 在堆或堆栈中分配似乎没有什么区别 gcc/clang的优化选
- 我在运行debian
- gcc(6.3)和clang(3.8)也会发生同样的情况
- 在堆或堆栈中分配似乎没有什么区别
- gcc/clang的优化选项没有什么区别(除了使两个版本更快)
- 显然,生成的程序集没有做任何奇怪的事情(一位同事说)
- 在较大的尺寸上,正常初始化更快。奇怪的事实是,与其他整数相比,二次幂上的反向初始化速度较慢(对于
的4096
),速度要慢25%SIZE
#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;
}