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

how to improve performance of 2d array in C++

本文关键字:二维数组 性能 c++      更新时间:2023-10-16

我有一个低级函数,它将被调用数百万次,所以它应该是非常高效的。当我在Linux中使用"gprof"时,我发现部分代码占用了函数总计算量的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];
        }
    }
谁能告诉我这段代码的问题在哪?为什么它的表现如此糟糕?

你可以一次完成:

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的初始化式中。

或者,如果Point中的xv都是连续数组:

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];
    }
}