MST

星途 面试题库

面试题:C++ 中优化循环性能的常用技巧

在C++编程中,循环操作频繁执行可能会影响程序性能。请阐述至少三种优化循环性能的常用技巧,并举例说明。
41.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 减少循环体内的计算量 在循环体内尽量避免执行重复且不必要的计算。例如:
// 未优化版本
for (int i = 0; i < n; ++i) {
    double result = sin(i) * cos(i);
    // 使用result进行其他操作
}

// 优化版本,提前计算常量
double factor = sin(1.0) * cos(1.0);
for (int i = 0; i < n; ++i) {
    double result = factor * i;
    // 使用result进行其他操作
}
  1. 缓存数组长度 如果在循环中频繁访问数组长度,将其缓存下来,避免每次循环都获取数组长度。例如:
// 未优化版本
std::vector<int> vec = {1, 2, 3, 4, 5};
for (size_t i = 0; i < vec.size(); ++i) {
    // 循环体操作
}

// 优化版本
std::vector<int> vec = {1, 2, 3, 4, 5};
size_t length = vec.size();
for (size_t i = 0; i < length; ++i) {
    // 循环体操作
}
  1. 使用合适的循环类型 根据具体需求选择forwhiledo - while循环。一般for循环更适合已知循环次数的场景,性能相对更好。例如:
// 使用for循环
for (int i = 0; i < 1000; ++i) {
    // 循环体操作
}

// 用while循环实现相同功能,相对不够直观
int i = 0;
while (i < 1000) {
    // 循环体操作
    ++i;
}
  1. 向量化 利用现代CPU的SIMD指令集对循环进行向量化。例如,使用__m128类型(SSE指令集)来同时处理多个数据:
#include <immintrin.h>
#include <iostream>

int main() {
    float arr[4] = {1.0f, 2.0f, 3.0f, 4.0f};
    __m128 vec = _mm_loadu_ps(arr);
    __m128 result = _mm_add_ps(vec, vec);
    _mm_storeu_ps(arr, result);
    for (int i = 0; i < 4; ++i) {
        std::cout << arr[i] << " ";
    }
    return 0;
}
  1. 展开循环 手动展开循环可以减少循环控制的开销。例如:
// 未展开版本
for (int i = 0; i < 8; ++i) {
    a[i] = b[i] + c[i];
}

// 展开版本
a[0] = b[0] + c[0];
a[1] = b[1] + c[1];
a[2] = b[2] + c[2];
a[3] = b[3] + c[3];
a[4] = b[4] + c[4];
a[5] = b[5] + c[5];
a[6] = b[6] + c[6];
a[7] = b[7] + c[7];

现代编译器通常会自动进行循环展开优化,但手动展开有时可以进一步微调。