当你有这样的代码(Java编写的,但适用于任何类似的语言):保存计算值而不是重新计算多次的术语是什么?
public static void main(String[] args) {
int total = 0;
for (int i = 0; i < 50; i++)
total += i * doStuff(i % 2); // multiplies i times doStuff(remainder of i/2)
}
public static int doStuff(int i) {
// Lots of complicated calculations
}
你可以看到,有改进的余地。 doStuff(i % 2)
只返回两个不同的值 - 一个用于偶数的doStuff(0)
,另一个用于奇数的doStuff(1)
。因此,您每次通过说doStuff(i % 2)
重新计算这些值会浪费大量计算时间/功耗。你可以这样改进:
public static void main(String[] args) {
int total = 0;
boolean[] alreadyCalculated = new boolean[2];
int[] results = new int[2];
for (int i = 0; i < 50; i++) {
if (!alreadyCalculated[i % 2]) {
results[i % 2] = doStuff(i % 2);
alreadyCalculated[i % 2] = true;
}
total += i * results[i % 2];
}
}
现在它访问一个存储值而不是每次重新计算。保持这样的数组可能看起来很愚蠢,但对于像例如i = 0, i < 500
的循环以及每次检查i % 32
等情况,数组是一种优雅的方法。
是否有这种代码优化术语?我想了解更多关于它的不同形式和约定,但我缺乏一个简洁的描述。