c语言'内存分配顺序'和'执行速度'

时间:2016-01-21 15:41:34

标签: c arrays performance memory-management

我正在使用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数组,在我的情况下,  以下两种不同的内存分配方式之间存在显着的“执行速度”差异。

  1. 按照~z_1的顺序分配内存,后跟~z_2

  2. 分配a_1,a_2后跟b_1,b_2,c_1,c_2和其他人?

  3. 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);
    }
    

    总之,在同一时间分配计算的数组是否会影响程序的执行速度?

    谢谢。

0 个答案:

没有答案