[英]Best way to optimize performance of program with arrays that regularly need to be reset to zero in C?
我已经搜索过之前是否有人问过这个问题,但我找不到任何东西 - 但是当我搜索时,我在这个答案和关于优化的问题的其他答案中发现了一些关于优化的有趣点。
我的问题是询问使用 C 将大型数组的元素设置为零的最有效/最快的方式。
该程序将跟踪大量粒子,>>>1000。 每个粒子由几个变量描述,其中一些变量需要在每次循环时重置为零,这将被执行 >>>1000 次。 可以处理的粒子的确切数量将取决于代码的效率。
选择似乎如下,我按照我从最低效率到最高效率的顺序对它们进行了排序。 (我尝试用指示性代码片段来描述它们——当然,这段代码不可能运行,而只是表明策略的东西——我意识到循环展开可能是一个好主意,但为了简单起见,它不是包括在下面)
/*structure definition*/
struct particle {
double a;
double b;
....
};
/*memory allocation*/
struct particle * part;
part = (struct particle *)calloc(N,sizeof(particle));
/*routine to set some particle variables to zero*/
for (i=0;i<N;i++)
{
part[i].a=0;
part[i].b=0;
.... etc....
}
/*structure definition*/
struct ensemble {
double * a;
double * b;
....
};
/*memory allocation*/
struct ensemble group;
group.a = (double *)calloc(N,sizeof(double));
group.b = (double *)calloc(N,sizeof(double));
/*routine to set some particle variables to zero*/
for (i=0;i<N;i++)
{
group.a[i]=0;
group.b[i]=0;
.... etc....
}
/*routine to set some particle variables to zero*/
free(group.a); group.a = (double *)calloc(N,sizeof(double));
free(group.b); group.b = (double *)calloc(N,sizeof(double));
本能地我认为必须有比 3) 更简单的方法来将 0 写入 memory,这不需要每次在循环周围释放然后重新分配大量 memory。 - 这个问题的答案提到memset
,我猜它会起作用,只要将所有内容按字节设置为零将给出值为0.0000000e00
的双精度值。
与上面的 2)、3)、4) 相同,但不使用任何数据结构,只需抓取 memory 以获得单独的 arrays。
/*memory allocation*/
double * a, * b, ... ;
a = (double *)calloc(N,sizeof(double));
b = (double *)calloc(N,sizeof(double));
/*routine to set some particle variables to zero*/
for (i=0;i<N;i++)
{
a[i]=0;
b[i]=0;
.... etc....
}
最后,我看到*(a+i)=0
会比a[i]=0
更快,但是为了便于阅读,上面的代码有a[i]
数组索引。
我也猜想可能是打开了优化标志的编译器会做一些这些事情。
我真的很想知道什么是最快的,以及在每次改进中可以获得多少改进..
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.