我有一个低级别的功能,将被调用数百万次,所以它应该非常有效。当我使用" 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];
}
}
有人能告诉我这段代码的问题吗?为什么表现如此糟糕?
答案 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];
}
}
您甚至可以将其提升到新的水平,并将整个内容放入x
和v
的初始值设定项中。
或者,如果x
中的v
和Point
是每个连续的数组:
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];
}
}