为什么emplace_back比push_back更快?

 迪信通-加盟部 发布于 2023-01-14 15:58
  • php
  • emplace_back做以下事情时,我认为这将是胜利者:

    v.push_back(myClass(arg1, arg2));
    

    因为emplace_back会在向量中立即构造对象,而push_back首先会构造一个匿名对象,然后将其复制到向量中.有关更多信息,请参阅此问

    谷歌也提出了这个和这个问题.

    我决定将它们与一个由整数填充的向量进行比较.

    这是实验代码:

    #include 
    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    using namespace std::chrono;
    
    int main() {
    
      vector v1;
    
      const size_t N = 100000000;
    
      high_resolution_clock::time_point t1 = high_resolution_clock::now();
      for(size_t i = 0; i < N; ++i)
        v1.push_back(i);
      high_resolution_clock::time_point t2 = high_resolution_clock::now();
    
      duration time_span = duration_cast>(t2 - t1);
    
      std::cout << "push_back took me " << time_span.count() << " seconds.";
      std::cout << std::endl;
    
      vector v2;
    
      t1 = high_resolution_clock::now();
      for(size_t i = 0; i < N; ++i)
        v2.emplace_back(i);
      t2 = high_resolution_clock::now();
      time_span = duration_cast>(t2 - t1);
      std::cout << "emplace_back took me " << time_span.count() << " seconds.";
      std::cout << std::endl;
    
      return 0;
    }
    

    结果emplace_back是更快.

    push_back took me 2.76127 seconds.
    emplace_back took me 1.99151 seconds.
    

    为什么?第一个相关问题的答案清楚地表明,没有性能差异.

    还尝试了我的pesudo网站的其他时间方法,但结果相同.

    [编辑]评论说用ints 测试没有说什么,push_back需要参考.

    我在上面的代码中做了相同的测试,但int我没有上课A:

    class A {
     public:
      A(int a) : a(a) {}
     private:
      int a;
    };
    

    结果:

    push_back took me 6.92313 seconds.
    emplace_back took me 6.1815 seconds.
    

    [EDIT.2]

    正如丹兰所说,我也应该改变操作的位置,所以我交换它们,在这两种情况下(intclass A),emplace_back再次成为胜利者.

    [解]

    我正在运行代码debug mode,这使得测量无效.对于基准测试,请始终运行代码release mode.

    撰写答案
    今天,你开发时遇到什么问题呢?
    立即提问
    热门标签
    PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有