push_back替代方案或存储二维数组的std::vector性能优化提速方法
C++性能优化方案
核心优化点
- 开启编译优化
优先给编译器配置最高优化等级:GCC/Clang添加编译参数-O2 -march=native,MSVC添加/O2,编译器会自动完成循环展开、指令向量化、冗余操作消除等底层优化,通常可获得数倍性能提升,是成本最低的优化手段。 - 消除循环内冗余计算
你当前代码中B数组在循环全程无修改,j从0到3对应的4组T1取值是固定的,可以提前预计算这4个T1模板,循环中直接拷贝模板即可,无需每次都给T1的6个double元素逐个赋值。 - 替换push_back为下标直接赋值
即使提前reserve,push_back仍需要做容量边界检查,你可以直接将B1resize到最终需要的400000长度,通过下标直接赋值,彻底省去push_back的额外开销。 - 合并嵌套循环
外层10万次、内层4次的嵌套循环可合并为单次40万次循环,减少循环变量判断的开销。
优化后参考代码
#include <iostream> #include <chrono> #include <vector> #include <array> #include <algorithm> int main() { using Array2d4 = std::array<std::array<double, 2>, 4>; using Array2d3 = std::array<std::array<double, 2>, 3>; Array2d4 B; B.fill({}); // 提前预计算4个T1模板 std::array<Array2d3, 4> tpls; for (std::size_t j = 0; j < 4; ++j) { tpls[j][0][0] = B[j][0]; tpls[j][0][1] = 0; tpls[j][1][0] = 0; tpls[j][1][1] = B[j][1]; tpls[j][2][0] = B[j][0]; tpls[j][2][1] = B[j][1]; } std::vector<Array2d3> B1; // 直接分配到需要的大小 B1.resize(400000); auto start1 = std::chrono::high_resolution_clock::now(); // 批量拷贝模板,减少重复操作 for (int i = 0; i < 100000; ++i) { std::copy(tpls.begin(), tpls.end(), B1.begin() + i * 4); } auto finish1 = std::chrono::high_resolution_clock::now(); std::chrono::duration<double> elapsed1 = finish1 - start1; std::cout << "Elapsed time: " << elapsed1.count() << " s\n"; return 0; }
如果你的实际场景中B的值会动态变化,不能提前预计算模板,也可以开启编译器自动向量化,或者使用SIMD intrinsic手动优化赋值逻辑,进一步提升性能。
内容的提问来源于stack exchange,提问作者user123456
相关产品推荐
相关产品推荐

