【发布时间】:2018-04-20 12:41:58
【问题描述】:
我在 C 中有以下循环,我试图从中删除 if 语句,以便每次迭代都不会检查它们。然而,我正在努力做到这一点。有没有人对我如何将它们取出有任何建议?
for(ix=0;ix<Nx;ix++) {
for(iy=0;iy<Ny;iy++) {
if (ix==0) {
pudx = (u[1][iy] + u[Nx-1][iy] - 2.0*u[0][iy])*(calc1);
} else if (ix==Nx-1) {
pudx = (u[0][iy] + u[Nx-2][iy] - 2.0*u[Nx-1][iy])*(calc1);
} else {
pudx = (u[ix+1][iy] + u[ix-1][iy] - 2.0*u[ix][iy])*(calc1);
}
if (iy==0) {
pudy = (u[ix][1] + u[ix][Ny-1] - 2.0*u[ix][0])*(calc2);
} else if (iy==Ny-1) {
pudy = (u[ix][0] + u[ix][Ny-2] - 2.0*u[ix][Ny-1])*(calc2);
} else {
pudy = (u[ix][iy+1] + u[ix][iy-1] - 2.0*u[ix][iy])*(calc2);
}
u_new[ix][iy] = 2.0*u[ix][iy] - u_old[ix][iy] + calc*(pudx+pudy);
}
}
【问题讨论】:
-
看看使用“switch - case”
-
看起来你是循环的第一次和最后一次迭代的特殊外壳......你应该能够更改循环测试和初始化,并且只需在循环内使用语句的 else 部分。
-
如果你能正确缩进你的代码会很有帮助。
-
一个像样的编译器很有可能,例如gcc 的最新版本,将为您解决这个问题。
-
@Gene,我没有看到 gcc 7.2.0 上的 -O2 有很多优化。与 OPs 版本相比,特殊外壳版本在我的机器上减少了 31% 的运行时间。使用 -O3,我看到运行时间减少了 73%。这让我很吃惊。
标签: c loops optimization