最近遇到日志队列记录每个客户端ID传送过来的日志,里面的数据量,多的时候非常庞大,从服务器再传到网页效率偶尔感觉较低,故从数据结构和网页Http协议上做了优化

里面最开始有个结构体,std::map<std::string clientID,logStruct logInfo>
用于存储每个客户端的总日志信息。这个Map里面存了大量的日志路径和其他的参数项
考虑优化该map

C++ STL Map模板类中除了 insert() 方法 还提供了 emplace() 和 emplace_hint() 成员函数,也可以实现向 map 容器中插入新的键值对。
实现相同的插入操作,都比 insert() 方法的效率高

关于这两个函数,做了一些验证
得出的结论是
当调用insert时,是将对象传递给insert,对象被拷贝到容器中,
而当我们使用emplace时,是将参数传递给构造函,emplace使用这些参数在容器管理的内存空间中直接构造元素

map容器的三种插入方式insert emplace emplace_hint效率对比,测试平台为X64 release

#include <iostream>
#include <map>
#include <string>class testMapDemo
{public:testMapDemo(int num) : num(num){std::cout << "testMapDemo构造函数" << std::endl;}testMapDemo(const testMapDemo& other) : num(other.num){std::cout << "testMapDemo拷贝构造函数" << std::endl;}testMapDemo(testMapDemo&& other) : num(other.num){std::cout << "testMapDemo移动构造函数" << std::endl;}
private:int num;
};int main()
{//创建空 map 容器std::map<std::string, testMapDemo>mymap;std::cout << "调用insert:" << std::endl;mymap.insert({ "insert", testMapDemo(100) });//std::cout << "调用emplace:" << std::endl;mymap.emplace("emplace", 100);//std::cout << "调用emplace_hint:" << std::endl;mymap.emplace_hint(mymap.begin(), "emplace_hint", 100);return 0;
}


ecplace和emplace都是在内部构造。少了两次移动构造。都说移动构造可以忽略不记,比拷贝代价低很多,那我们修改下上面的代码,循环插入10万次 和100万次看下。

#include <iostream>
#include <map>
#include <string>
#include<time.h>class testMapDemo
{public:testMapDemo(int num) : num(num){//std::cout << "testMapDemo构造函数" << std::endl;}testMapDemo(const testMapDemo& other) : num(other.num){// std::cout << "testMapDemo拷贝构造函数" << std::endl;}testMapDemo(testMapDemo&& other) : num(other.num){//std::cout << "testMapDemo移动构造函数" << std::endl;}
private:int num;
};int main()
{int testTimes = 1000000;//计时clock_t start, end;start = clock();//创建空 map 容器std::map<std::string, testMapDemo>mymap_insert;for (int i = 0; i < testTimes; i++){//模拟不同key插入std::string tempKey = "insert" + std::to_string(i);mymap_insert.insert({ tempKey, testMapDemo(100) });}end = clock();double  insertTime = (double)(end - start);std::cout << "调用insert 100万次,时间:" << insertTime / CLOCKS_PER_SEC << std::endl;////创建空 mymap_emplace 容器start = clock();std::map<std::string, testMapDemo>mymap_emplace;for (int i = 0; i < testTimes; i++){//模拟不同key插入std::string tempKey = "insert" + std::to_string(i);mymap_emplace.emplace(tempKey, 100);}end = clock();insertTime = (double)(end - start);std::cout << "调用emplace 100万次,时间:" << insertTime / CLOCKS_PER_SEC << std::endl;////创建空 mymap_emplace_hint 容器start = clock();std::map<std::string, testMapDemo>mymap_emplace_hint;for (int i = 0; i < testTimes; i++){//模拟不同key插入std::string tempKey = "insert" + std::to_string(i);mymap_emplace_hint.emplace(tempKey, 100);}end = clock();insertTime = (double)(end - start) ;std::cout << "调用emplace_hint 100万次,时间:" << insertTime / CLOCKS_PER_SEC << std::endl;return 0;
}


因为emplace_hint是可以指定位置插入的。会改变数据原有的位置和调整,所以有时候时间可能因为内部调整会慢一些,但是比insert效率还是来的高

写在结尾:
值得一提的是,一开始踩过的坑
std::map的不管哪个方法会忽略重复key,而不是替换,std::map必须先找出来erase掉才能插入。
QT里的QMap会默认直接替换。

C++ STL map插入效率优化相关推荐

  1. Insert SQL Query插入效率优化

    主要针对PostgreSQL,其中部分原则也可以其他数据库: 1. 使用Transaction,减少提交次数.(副作用是难以获取执行进度) 2. (仅)PG中可以使用独有的copy方法. 3. 使用u ...

  2. C++ 笔记(24)— STL map 类(map实例化、插入、查找、删除)

    1. STL 映射类简介 map 和 multimap 是键-值对容器,支持根据键进行查找,区别在于,后者能够存储重复的键,而前者只能存储唯一的键. 为了实现快速查找, STL map 和 multi ...

  3. 简单DP (Preparing for Xtreme 12.0) | STL map使用

    当水题遇上了map大坑 晚上写一个dp,弄了半天样例一直不过,对着队友的代码一行行看,发现跟自己逻辑完全一样啊... 然后就逐行输出比对,发现预处理出了问题,把map插入新值的地方改了下,果然就好了. ...

  4. 学习STL map, STL set之数据结构基础

    STL map和set的使用虽不复杂,但也有一些不易理解的地方,如: 或许有得人能回答出来大概原因,但要彻底明白,还需要了解STL的底层数据结构. C++ STL 之所以得到广泛的赞誉,也被很多人使用 ...

  5. C++ STL map emplace()和emplace_hint()(深入了解,一文学会)

    C++ STL Map模板类中除了 insert() 方法 还提供了 emplace() 和 emplace_hint() 成员函数,也可以实现向 map 容器中插入新的键值对.本节就来讲解这 2 个 ...

  6. C++ STL map的使用和性能分析

    1.map简介 map是一类关联式容器.它的特点是增加和删除节点对迭代器的影响很小,除了那个操 作节点,对其他的节点都没有什么影响.对于迭代器来说,可以修改实值,而不能修改key. 2.map的功能 ...

  7. (Fw)STL map 详解

    1.map简介 map是一类关联式容器.它的特点是增加和删除节点对迭代器的影响很小,除了那个操 作节点,对其他的节点都没有什么影响.对于迭代器来说,可以修改实值,而不能修改key. 2.map的功能 ...

  8. 【C++】STL map 与 multimap 用法和区别

    参考: https://blog.csdn.net/shuzfan/article/details/53115922 https://www.nhooo.com/cpp/cpp-map-swap-fu ...

  9. STL map 简介

    STL map 简介 转载于:http://www.cnblogs.com/TianFang/archive/2006/12/30/607859.html 1.目录 map简介 map的功能 使用ma ...

  10. [转]MySQL innoDB数据插入性能优化

    转载自: http://hiyijian.blog.163.com/blog/static/173086472201121621326471/ 起因:有一个innoDB引擎的表Table,在一个大概3 ...

最新文章

  1. StoneAge Dict 技术方案的可行性[1]
  2. 一款不错的网页对话插件
  3. rgb颜色分量的旋转_RGB分量之偏色与彩色图片转黑白
  4. AIS 2022 | ACL-IJCAI-SIGIR顶级会议论文预讲会,现开启论文征集
  5. idea创建springboot项目+mybatis_Spring Boot + MyBatis 多模块项目搭建教程
  6. ajax get请求_python测试开发django50.jquery发送Ajax请求(get)
  7. 会话,授权,认证概念解析
  8. 横跨7个版本的OpenStack无感知热升级在360的落地与实践
  9. sqlalchemy 聚合
  10. 深度学习入门之二阶段小demo练习(持续更新系列)
  11. ERP系统实施之入门
  12. php或js判断网站访问者来自手机或者pc机
  13. Android Split的用法
  14. java 奇数trun_N26-博客作业-week15
  15. 生活随记 - 祝福大家2021年新年快乐
  16. 钕铁硼产品磁性能相对检测原理与技术
  17. 【debug】汇编跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等
  18. 大数据开发工程师前景如何?
  19. Shell编程之概述
  20. 全球前十大一致性最好的交易系统之一Aberration(附源码)

热门文章

  1. 复合辛普森公式c语言编程,复合辛普森公式
  2. python读取文件夹下所有图片并重命名_python 对文件夹下图片 批量重命名
  3. MTK6577+Android之按键(key)修改
  4. MTK6577+Android之Camera驱动) ~% d
  5. 解决阿里云oss 图片跨域问题
  6. 移动通信核心网技术总结(四)IMS的网络架构和功能
  7. unity二維碼生成(新)
  8. [RK3568 Android11] 开发之强制APP横屏或者竖屏显示
  9. Android共享元素过渡动画解析
  10. 注解@NotEmpty、@NotBlank、@NotNull三者的区别及使用范围