C ++将2D数组的部分复制到另一个2D数组中,表现出色

时间:2017-11-08 22:26:36

标签: c++ performance multidimensional-array

在我的程序中,我有一个被称为数千次的函数。该函数有一个参数,bool值数组,长度= 30000。基于这个bool数组,我从一个全局的2d数组变量复制一些行来构建一个本地的2d数组。然后我找到本地2d数组中每列的平均值。然后我获取本地2d数组中的每个值并减去它的列均值,以便构建第二个本地2D数组。

程序按预期执行,但由于我添加了相关功能,因此需要花费太长时间。是否有更快的方法从二维数组中获取数据子集并创建一个新的二维数组?有没有更快的方法从二维数组中的每个值中减去列平均值?也许我应该研究向量或在函数之外声明事物......

谢谢。

double FitValue(bool *X){
    int i,j,k; //loop index
    int counter;
    int numUsedVariables = 0; //
    double sum;
    //find number of selected variables
    for(i=0; i<NUMVARIABLES; i++){ //NUMVARIABLES is a globally defined variable
        if(X[i] == true){
            numUsedVariables += 1;
        }
    }   
    //declare matrix for variable subset    
    alglib::real_2d_array input;
    input.setlength(NUMINDIVS,numUsedVariables); 
    //populate matrix for variable subset
    counter = -1;
    for(i=0; i<NUMVARIABLES; i++){ //NUMVARIABLES is a globally defined variable
        if(X[i] == true){       
            counter++;
            for(j=0; j<NUMINDIVS; j++){ //NUMINDIVS is a globally defined variable      
                input[j][counter] = genotype[i][j]; //genotype is global variable
            }   
        }
    }
    //find the mean of each column
    alglib::real_1d_array colMeans;
    colMeans.setlength(numUsedVariables);
    for(i=0; i<numUsedVariables; i++){
        sum = 0;
        for(j=0; j<NUMINDIVS; j++){
            sum += input[j][i];     
        }   
        colMeans[i] = sum/NUMINDIVS;
    }   
    //declare centered selected markers matrix
    alglib::real_2d_array centeredInput;
    centeredInput.setlength(NUMINDIVS,numUsedVariables);    
    for(i=0; i<numUsedVariables; i++){   
        for(j=0; j<NUMINDIVS; j++){
            centeredInput[j][i] = input[j][i]   - colMeans[i];
        }
    }
    //perform further analysis ...
    //...

}   

1 个答案:

答案 0 :(得分:1)

您的代码速度变慢,因为以列优先顺序访问2D数组。每次CPU从主存储器获取一个数字时,都会将一大堆数字提取到缓存中。请记住,C / C ++将数组存储为行优先,如果您需要的下一个数字位于下一行,则所有缓存数据都是无用的。 CPU必须返回主存储器才能获取下一个数字。与访问缓存中已有的数据相比,进入主内存是一个非常缓慢的过程。
为了使代码运行得更快,您需要考虑如何重新组织数据,以便以最缓存友好的方式访问它们。这段代码
for(i=0; i<numUsedVariables; i++) for(j=0; j<NUMINDIVS; j++) centeredInput[j][i] = input[j][i] - colMeans[i]; 会跑得慢得多 for(j=0; j<NUMINDIVS; j++) for(i=0; i<numUsedVariables; i++) centeredInput[j][i] = input[j][i] - colMeans[i];