【发布时间】:2020-08-02 02:45:36
【问题描述】:
void evolve(board prv, board nxt){
int i, j;
int n;
printf("\rGeneration %d\n", generation++);
if (printLazy == 1){
lazyPrint(prv);
for (j=0; j < WIDTH; ++j) {
for (i = 0; i < HEIGHT; ++i) {
n = neighbors(prv, i, j);
if (prv[i][j] && (n == 3 || n == 2))
nxt[i][j] = true;
else if (!prv[i][j] && (n == 3))
nxt[i][j] = true;
else
nxt[i][j] = false;
}
}
}
** 有人要求我添加邻居方法
static int neighbors (board b, int i, int j) {
int n = 0;
int i_left = max(0,i-1);
int i_right = min(HEIGHT, i+2);
int j_left = max(0,j-1);
int j_right = min(WIDTH, j+2);
int ii, jj;
for (ii = i_left; ii < i_right; ++ii) {
for (jj = j_left; jj < j_right; ++jj) {
n += b[ii][jj];
}
}
return n - b[i][j];
}
所以我正在努力优化它,以便它运行得更快,但我一直在思考如何进一步优化它。这是我目前所拥有的
void evolve(board prv, board nxt) {
register int i, j;
int n;
bool next;
printf("\rGeneration %d\n", generation++);
if (printLazy == 1){
lazyPrint(prv);
}
for (j=0; j < WIDTH; ++j) {
for (i = 0; i < HEIGHT; ++i) {
n = neighbors(prv, i, j);
if (prv[i][j])
if (n == 2)
next = true;
else if (n == 3)
next = true;
else
next = false;
else
if(n == 3)
next = true;
else
next = false;
nxt[i][j] = next;
}
}
}
有没有更好的方法来做到这一点,或者你们有什么推荐的资源或视频?
谢谢,感谢任何帮助。
【问题讨论】:
-
编译启用优化。这很可能比你手工做的任何事情都要好。
-
我想知道切换循环(首先有主轴)嵌套是否可以实现更好的数据局部性。我也喜欢使用临时变量,通过减少重复表达式来“阅读简单” if没有别的。
-
你优化,因为你大概关心性能,但你不衡量性能,所以你不关心它。看到问题了吗?制作一个优化的发布版本,在 VTune 或 cachegrind 之类的东西下运行它,看看你“改进”的东西是否真的改进了东西。
-
发布
neighbors()的定义以获得更好的想法。
标签: c optimization conways-game-of-life