码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C++push_back、emplace_back、emplace性能对比


    简介

    push_back, emplace_back, emplace都是往容器中添加一个元素,后两者是c++11新加的,它们三者的区别在于,push_back添加元素,需要先调用被添加元素的构造函数,再调用移动构造函数。而emplace_back和emplace_back只需要调用一次构造函数, 举个例子。

    vector<int> vec;
    v.push_back(1);
    v.emplace_back(2);
    v.emplace(v.end(),3);
    
    • 1
    • 2
    • 3
    • 4

    1作为实参传入push_back时,需要先构造一个整数对象1,然后调用移动构造函数将对象1存入vec中,调用了两次构造函数;而emplce和emplace_back直接将构造的对象存入vec中。

    测试

    #include
    #include
    #include
    using namespace std;
    const int N = 1000;
    
    class A {
    private:
    	int age;
    	string name;
    public:
    	A(int age, string name):age(age), name(name){
    	} 
    };
    int main() {
    	vector<A> vec;
    	clock_t start, end;
    	start = clock();
    	A a(1,"xx");
    	for (int i = 0; i < N; i++) {
    		vec.push_back({1,"xx"});
    	}
    	end = clock();  
    	cout<<"push_back, time1 = "<<double(end-start)/CLOCKS_PER_SEC<<"s"<<endl; 
    	
    	start = clock(); 
    	for (int i = 0; i < N; i++) {
    		vec.emplace_back(1,"xx");
    	}
    	end = clock();   
    	cout<<"emplace_back, time2 = "<<double(end-start)/CLOCKS_PER_SEC<<"s"<<endl; 
    	
    	start = clock(); 
    	for (int i = 0; i < N; i++) {
    		vec.emplace(vec.end(), 3,"xz");
    	}
    	end = clock(); 
    	cout<<"emplace time3 = "<<double(end-start)/CLOCKS_PER_SEC<<"s"<<endl; 
    	return 0;
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    测试结果

    以下是测试结果,测试环境为win10,i5 cpu,

    Npush_backemplace_backemplace
    1k0s0s0s
    1w0.015s0s0s
    10w0.046s0.016s0.047s
    100w0.283s0.168s0.266s
    1000w3.137s2.283s1.641s

    结论:
    在数据量较少(1w)以内,三者几乎无区别,耗时接近于0s; 数据量在1w至100w时, emplace_back性能最优,push_back和emplace相当;数据量达到1000w时,emplace比emplace_back和push_back都要快。
    对于大多数时候,我们只需要知道怎么去调用,怎么传入参数,但是,涉及到性能方面或者调优时,就需要更深入了解其中的实现原理。

    参考

    C++ STL vector插入元素(insert()和emplace())详解
    C++ STL vector添加元素(push_back()和emplace_back())详解
    emplace_back/emplace 与 push_back/insert 效率的详细比较

  • 相关阅读:
    对接建行支付
    RHCE 9.0培训课程之容器技术的运行
    NMEA0813协议简介
    【golang学习之旅】Go语言常用转义字符
    使用贪心来解决的一些问题
    【STL源码剖析】vector类模拟实现 了解底层-走进底层-掌握底层【超详细的注释和解释】
    FFmpeg关键函数介绍
    【自然语言处理(NLP)】基于ERNIE-GEN的中文自动文摘
    Jquery 如何获取子元素。如何找到所有 HTML select 标签的选中项。jQuery 里的 ID 选择器和 class 选择器有何不同
    C++-类与对象(上)
  • 原文地址:https://blog.csdn.net/CCSUXWZ/article/details/133428587
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号