请教c++ 11 中emplace_back 和 push_back性能差异问题

sx666777888 2017-12-17 12:18:32

#include <iostream>
#include <time.h>
#include <sys/timeb.h>
#include <vector>
using namespace std;
const int cnt = 5000000;

class X
{
public:
X(int i=0,const string &s=""):i(i),s(s){}
private:
int i ;
string s;
};

double get_diff(const struct timeb &left,const struct timeb & right)
{
double mill_sec_diff = 0;
double sec_diff= 0;
if(left.millitm >= right.millitm)
{
mill_sec_diff = left.millitm - right.millitm;
sec_diff = left.time - right.time;
}
else
{
mill_sec_diff = left.millitm - right.millitm + 1000;
sec_diff = left.time - right.time -1;
}
return sec_diff + mill_sec_diff/1000;
}
int main()
{
struct timeb begin,mid,end;
ftime(&begin);
vector<X> vec;
for (int i =0;i != cnt;++i)
{
vec.push_back(X(i));
}
ftime(&mid);
vector<X> vec2;
for(int i =0;i != cnt;++i)
{
vec2.emplace_back(i," ");
}
ftime(&end);

cout<<"push time:"<<get_diff(mid,begin)<<endl;
cout<<"emplace time:"<<get_diff(end,mid)<<endl;
}

执行结果:

代码中有一点缺陷是统计的不是进程的耗时,不过这个层面我感觉也能说明问题了,可是出乎意料为什么emplace_back的耗时比push_back的耗时还要多啊,不是已经节省了一次拷贝了嘛,这个不是很明白。
...全文
545 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yshuise 2019-07-08
  • 打赏
  • 举报
回复
我觉得你的string要输入很长很长,这样才能体现性能差异。
taodm 2019-07-08
  • 打赏
  • 举报
回复
对于小代码/小对象,你可能根本无法感受到区别。 你搞个vector的vector,可能就有感觉了。
sandyznb 2019-07-05
  • 打赏
  • 举报
回复
为啥我再vs2012中测试的 测试的 push_back 是0.769 emplace_back 是0.582 不管是debug 还是release push_back的时间都长
sx666777888 2017-12-23
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
了解,我找找资料试试分析,多谢
xskxzr 2017-12-19
  • 打赏
  • 举报
回复
push_back不带"",emplace_back带"",明显不公平。
赵4老师 2017-12-18
  • 打赏
  • 举报
回复
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
paschen 版主 2017-12-18
  • 打赏
  • 举报
回复
具体可使用性能分析,对于这种简单的类,复制是很快的,两者没有可比性,可能emplace设计上增加的的耗时超过复制对象的耗时也是有可能的
真相重于对错 2017-12-18
  • 打赏
  • 举报
回复
class X { public: X(int i=0,const string &s=""):i(i),s(s){} X(X&& other) : i(std::move(other.i)), s(std::move(other.s)) { sleep(1000); }//加这么一个函数试试 private: int i ; string s; };
yshuise 2017-12-18
  • 打赏
  • 举报
回复
用release版本试试
wodexiaojidan 2017-12-17
  • 打赏
  • 举报
回复
听没听过牺牲内存换取时间, 你可以跟踪下汇编指令就知道差异了
sx666777888 2017-12-17
  • 打赏
  • 举报
回复
引用 1 楼 wodexiaojidan 的回复:
听没听过牺牲内存换取时间, 你可以跟踪下汇编指令就知道差异了
这个个人觉得没有使用内存换取时间吧,应该是技术上实现的直接在容器内存中调用构造函数,减少了一次拷贝构造

64,661

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧