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

相关推荐
刘马想放假3 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠4 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦11 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠12 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾12 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82112 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q12 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒12 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
世人万千丶12 天前
成语接龙小应用 - HarmonyOS ArkUI 开发实战-TextInput与List列表-PC版本
华为·list·harmonyos·鸿蒙·鸿蒙系统
WL学习笔记12 天前
单项不带头不循环链表
数据结构·链表