这是原始代码
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];
}
}
在这种情况下,常见的子表达式消除有助于提高性能?它唯一的数组索引是否经过优化?
答案 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];
}
}