如何在C ++中提高二维数组的性能

时间:2016-11-05 13:56:00

标签: c++ arrays performance multidimensional-array

我有一个低级别的功能,将被调用数百万次,所以它应该非常有效。当我使用" gprof"在Linux中,我发现代码的一部分占函数总计算的60%(其余部分是求解三次方程的根)。这里Point是一个具有x和v的数据结构,它将被转换为矩阵供以后使用。我们的想法是从第一行中减去每一行。代码如下所示

    double x[4][3] = {0}, v[4][3] = {0};
    for (int i = 0; i < 4; ++i){
        for (int j = 0; j < 3; ++j){
            v[i][j] = Point[i]->v[j];
            x[i][j] = Point[i]->x[j];
        }
    }
    for (int i = 1; i < 4; ++i){
        for (int j = 0; j < 3; ++j){
            v[i][j] = v[0][j] - v[i][j];
            x[i][j] = x[0][j] - x[i][j];
        }
    }

有人能告诉我这段代码的问题吗?为什么表现如此糟糕?

1 个答案:

答案 0 :(得分:0)

你可以一次性完成所有这些:

double x[4][3] = {
    { Point[0]->x[0], Point[0]->x[1], Point[0]->x[2] }
};
double v[4][3] = {
    { Point[0]->v[0], Point[0]->v[1], Point[0]->v[2] }
};

for (int i = 1; i < 4; ++i){
    for (int j = 0; j < 3; ++j){
        x[i][j] = x[0][j] - Point[i]->x[j];
        v[i][j] = v[0][j] - Point[i]->v[j];
    }
}

您甚至可以将其提升到新的水平,并将整个内容放入xv的初始值设定项中。

或者,如果x中的vPoint是每个连续的数组:

double x[4][3], v[4][3]; // no init

// fill entire arrays
for (int i = 0; i < 4; ++i){
    memcpy(x[0], Point[0]->x, sizeof(x[0]));
    memcpy(v[0], Point[0]->v, sizeof(v[0]));
}

for (int i = 1; i < 4; ++i){
    for (int j = 0; j < 3; ++j){
        x[i][j] -= Point[i]->x[j];
        v[i][j] -= Point[i]->v[j];
    }
}