编译器可能采用的优化策略
- 循环展开:减少循环控制的开销。例如将多次循环合并为一次执行。
- 指令级并行:利用现代CPU的特性,同时执行多条不相关的指令。
- 公共子表达式消除:对于循环中重复计算的表达式,只计算一次。
代码层面的调整
- 循环展开示例
// 原始代码
int arr[100];
for (int i = 0; i < 100; i++) {
arr[i] = arr[i] * 2 + 1;
}
// 循环展开后的代码
int arr[100];
for (int i = 0; i < 100; i += 4) {
arr[i] = arr[i] * 2 + 1;
arr[i + 1] = arr[i + 1] * 2 + 1;
arr[i + 2] = arr[i + 2] * 2 + 1;
arr[i + 3] = arr[i + 3] * 2 + 1;
}
- 减少循环中的函数调用:如果循环内调用函数,尽量将函数内联或者将不变的函数调用提到循环外部。
// 原始代码
int func(int a) {
return a * 2;
}
int arr[100];
for (int i = 0; i < 100; i++) {
arr[i] = func(arr[i]) + 1;
}
// 调整后的代码,将函数内联
int arr[100];
for (int i = 0; i < 100; i++) {
arr[i] = arr[i] * 2 + 1;
}
- 使用指针代替数组下标:指针操作在某些情况下可能更快。
// 原始代码
int arr[100];
for (int i = 0; i < 100; i++) {
arr[i] = arr[i] * 2 + 1;
}
// 使用指针的代码
int arr[100];
int *ptr = arr;
for (int i = 0; i < 100; i++) {
*ptr = *ptr * 2 + 1;
ptr++;
}