嵌套用于循环优化

时间:2011-12-25 09:57:43

标签: arrays performance memory language-agnostic

这是原始代码

for (j = 0; j <= 30; j++) {
  for (k = 0; k <= 30; k++) {
    x[j][k] = y[j][k] + z[j][k];
  }
}

以下代码是在应用公共子表达式消除优化之后

for (j = 0; j <= 30; j++) {
  for (k = 0; k <= 30; k++) {
    t2 = C1 * j + W * k;
    x[t2] = y[t2] + z[t2];
  }
}

在这种情况下,常见的子表达式消除有助于提高性能?它唯一的数组索引是否经过优化?

2 个答案:

答案 0 :(得分:2)

它有帮助,因为执行2D索引会执行隐式乘法,并在每次执行[j][k]时添加。在第二个中,您只执行算术ONCE(每次循环迭代)并将基本上[j][k]存储到t2并仅重用t2,而不是隐式执行[j][k]原始代码中的算术三次。

当然,编译器通常很聪明,可以更好地了解,但我认为你只是要求理论。

答案 1 :(得分:2)

任何半体面的现代编译器都已经在执行此优化。

此外,部分指数计算应该被提升到外部循环中:

for (j = 0; j <= 30; j++) {
  t1 = C1 * j;
  for (k = 0; k <= 30; k++) {
    t2 = t1 + W * k;
    x[t2] = y[t2] + z[t2];
  }
}