我正在使用c。
创建一个程序我有很多数组,每个数组的大小都不小。 (每个阵列中超过10,000个元素)。
并且,有一组数组经常被访问和计算。
例如,
a_1[index] = constant * a_2[index];
b_1[index] = constant * b_2[index];
a_1是使用a_2进行计算,b_1是使用b_2计算的。
假设我有一个~z_1和一个~z_2数组,在我的情况下, 以下两种不同的内存分配方式之间存在显着的“执行速度”差异。
按照~z_1的顺序分配内存,后跟~z_2
分配a_1,a_2后跟b_1,b_2,c_1,c_2和其他人?
1
MALLOC(a_1);
MALLOC(b_1);
...
MALLOC(z_1);
MALLOC(a_2);
...
MALLOC(z_2);
2
MALLOC(a_1);
MALLOC(a_2);
MALLOC(b_1);
MALLOC(b_2);
...
MALLOC(z_1);
MALLOC(z_2);
我认为,由于命中率,以第二种方式分配内存会更快。
由于在相似时间内分配的数组将位于相似的地址中,因此这些数组将同时上载到现金或RAM中,因此计算机无需多次上传数组来计算一行代码。
例如,计算
a_1[index] = constant * a_2[index];
,不要单独上传a_1和a_2。
(这是正确的吗?)
然而,对我来说,在维护方面,第一种方式的分配要容易得多。 我有AA_a~AA_z_1,AA_a~AA_z_2,BB_a~BB_z_1,CC_a~CC_z~1等阵列。 因为我可以通过以下方式有效地使用MACRO来分配内存。
像,
#define MALLOC_GROUP(GROUP1,GROUP2)
MALLOC(GROUP1##_a_##GROUP2);
MALLOC(GROUP1##_b_##GROUP2);
...
MALLOC(GROUP1##_z_##GROUP2)
void allocate(){
MALLOC_GROUP(AA,1);
MALLOC_GROUP(AA,2);
MALLOC_GROUP(BB,2);
}
总之,在同一时间分配计算的数组是否会影响程序的执行速度?
谢谢。