【发布时间】:2016-11-05 13:55:59
【问题描述】:
我有一个会被调用数百万次的低级函数,所以它应该非常高效。当我在 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];
}
}
谁能告诉我这段代码的问题?为什么它的表现如此糟糕?
【问题讨论】:
-
如果你的代码有效,但可以改进,这里就不说了。请在 Code Review 上发布。
-
您是否让编译器通过设置优化级别 3 或类似级别来做到最好?
-
Point到底是什么? -
您正在初始化这些数组(
x和v)三次,每次都用全新的值覆盖整个范围(第一行除外,您初始化两次)独立于上一个条目。然后问问自己,如果你真的需要这些本地副本,你能不能不简单地使用Point[i]->v[j] - Point[0]->v[j]i > 0?因此,首先保存所有副本。 -
感谢您的所有回复。我没有使用编译器优化,因为我想自己提高性能。我发现问题来自for循环。如果我在不使用 for 循环的情况下手动分配值,性能会变得更好。它只需要总计算时间的 20%。我对这个问题有点困惑。
标签: c++ arrays performance multidimensional-array