You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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仍需要做容量边界检查,你可以直接将B1 resize到最终需要的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:09:00