新运营商中分配器的平均时间

时间:2013-09-16 14:33:34

标签: c++ performance c++11 copy move

我总是在分配一些内存时读取新内容很慢,但从来没有发现它有多慢。所以我开始进行一些研究和测试。

假设我有一个缓冲区,它是一个向量(例如用于以太网接收器)。

  1. 我可以使这个缓冲区成为一个类的成员,用数据填充它,然后将此缓冲区复制到用户定义的缓冲区。
  2. 我可以创建一个新缓冲区并将其移动到用户定义。
  3. 所以现在我的问题是哪个更快。在搜索网络时,我没有真正找到任何基准或其他东西。所以我开始做一些测试。

    2个varint不是接收器!

    复制变体

    auto time = GetTickCount();
    std::vector<int> vec;
    std::vector<int> tmp(250);
    
    for(int i=0; i<10000; i++) {
      for(int i=0; i<1000; i++) {
        vec.insert(vec.end(), tmp.begin(), tmp.end());
        //std::copy(tmp.begin(), tmp.end(), std::back_inserter(vec1));
      }
      vec.clear();
    }
    
    std::cout << GetTickCount() - time << std::endl;
    

    移动变体

    auto time = GetTickCount();
    std::vector<std::vector<int> > vec;
    
    for(int i=0; i<10000; i++) {
      for(int i=0; i<1000; i++) {
        std::vector<int> tmp(250);
        vec.push_back(std::move(tmp));
      }
      vec.clear();
    }
    
    std::cout << GetTickCount() - time << std::endl;
    

    我知道分配内存取决于硬件,操作系统和内存管理,但平均时间我可以说创建一个新的并移动它比复制现有的更好吗?在我的测试中,我发现应对具有250个元素的向量需要与移动大约相同的时间,并且超过250个元素的复制变体比移动的要慢。确保在我的测试中,移动变量是向量的向量,并且迭代更加困难,但这在我(大多数情况下)的情况下无关紧要。测试也是使用int而不是某些结构或类会使问题复杂化。

    我的测试也是(快速和脏)在Windows机器上。我的兴趣是平均时间(或在我的条件下,大小)为虚拟硬件和ussual系统(windows,linux,mac)。

    我可以接受我的测试并说复制超过400个元素比创建一个新元素慢吗?


    编辑:

    Neil Kirk建议我尝试随机大小分配,所以我做了。我还插入了一些其他的东西,在测试和平均大小之间进行分配(但没有删除),大约是 1000 元素。

    我接受Mats Petersson的回答,特别是在阅读this(和子链接)和this之后(旁边是唯一一个)。但我有一个补充:你不知道它是否是过早优化没有任何估价。如果一个alloc会花费相同的时间来复制100000个元素我永远不会使用它,否则如果它需要相同的时间来复制10个元素,我会一直使用它。但是在网络场景中我有1000个元素的近似值,我将网络作为瓶颈,我可以说它是过早的优化。所以我决定使用ne分配变体,因为它在我的概念中更有用。

1 个答案:

答案 0 :(得分:1)

这是“过早优化”的典型案例。找出代码的这一部分是否是性能方面的重要因素。如果不是,那就不要担心 - 从手头的实际任务做最有意义的事情。

一般来说,分配内存的速度相当快 - 除了基本类型(intchar等)以外的任何其他内容,主要因素可能是创建/复制/移动内存所需的时间。进入向量的对象,而不是基本分配。