std::list里面的push_back和resize效率问题

2024年8月6日:

向list里面循环添加数据,两种写法

cpp 复制代码
for(;;){
  myList.resize(myList.size()+1);
  MyObject &obj= *myList.rbegin();
  obj.a= itervalue;
}

第二种写法是push_back:

cpp 复制代码
for(;;){
  MyObject obj;
  obj.a= itervalue;
  myList.push_back(obj);
}

用第一种用法,是避免了push_back的拷贝构造函数,用的缺省构造函数,对于COPY构造函数效率毕竟低的场景,也许有效。但是大部分时间应该没有啥用。

效率上,找了一个评测网站:

Quick C++ Benchmarks

代码:

cpp 复制代码
#include <vector>
#include <list>

constexpr size_t loopCount = 1000;

struct BigObject{
    double LongDouble[10000];
};

static void VectorPushBack(benchmark::State& state) {
  for (auto _ : state) {
    std::vector<BigObject> vec;
    for (int i = 0; i < loopCount; i++) {
      BigObject bo;
      vec.push_back(bo);
    }
    benchmark::DoNotOptimize(vec);
  }
}
BENCHMARK(VectorPushBack);

static void VectorEmplaceBack(benchmark::State& state) {
  for (auto _ : state) {
    std::vector<BigObject> vec;
    for (int i = 0; i < loopCount; i++) {
      vec.emplace_back();
    }
    benchmark::DoNotOptimize(vec);
  }
}
BENCHMARK(VectorEmplaceBack);

static void ListPushBack(benchmark::State& state) {
  for (auto _ : state) {
    std::list<BigObject> list;
    for (int i = 0; i < loopCount; i++) {
      BigObject bo;
      list.push_back(bo);
    }
    benchmark::DoNotOptimize(list);
  }
}
BENCHMARK(ListPushBack);

static void ListEmplaceBack(benchmark::State& state) {
  for (auto _ : state) {
    std::list<BigObject> list;
    for (int i = 0; i < loopCount; i++) {
      list.emplace_back();
    }
    benchmark::DoNotOptimize(list);
  }
}
BENCHMARK(ListEmplaceBack);
static void ListResize(benchmark::State& state) {
  for (auto _ : state) {
    std::list<BigObject> list;
    for (int i = 0; i < loopCount; i++) {
      BigObject bo;
      //list.push_back(bo);
      list.resize(list.size()+1);
      BigObject &obj = *list.rbegin();
      obj=bo;
    }
    benchmark::DoNotOptimize(list);
  }
}
BENCHMARK(ListResize);

结果:push_back效率最高,高的原因不详

参考:

https://www.reddit.com/r/cpp_questions/comments/15uekey/push_back_big_object_into_stdvector_by_creating/?rdt=60610

相关推荐
启观川2 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
Logic1013 小时前
C语言/数据结构欧几里得算法题解:长方形切割最大正方形——贪心划分计数
c语言·数据结构·算法·贪心算法·时间复杂度·空间复杂度·欧几里得算法
无忧.芙桃4 小时前
C++语言原理与实践(十二):list类的底层实现
c++·windows·list
flinn_small5 小时前
三分算法:原理、实现与实战应用
数据结构·算法·三分
INGNIGHT6 小时前
944 · 最大子矩阵(前缀和)
数据结构·c++·算法
All for pursuit.7 小时前
【动态规划-6】96.不同的二叉搜索树
数据结构·c++·算法·leetcode·动态规划
信奥卷王7 小时前
[GESP202609 六级] 数组划分
数据结构·算法
All for pursuit.9 小时前
【并查集-2】399.除法求值
数据结构·c++·算法·leetcode
殷色玫瑰11 小时前
AVL树:从平衡因子到四种旋转的完整实现
c语言·数据结构·c++·算法·visualstudio
y1su12 小时前
Leetcode 二分模板
java·数据结构·算法·leetcode·排序算法