填充整数列表比填充整数向量快100倍

时间:2014-02-17 11:29:32

标签: c++ performance list vector

我正在比较使用整数向量填充整数列表所花费的时间。

每个载体& list填充了1000万个随机整数,并且该实验重复100次以找到平均值。

令我惊讶的是,填充列表比填充整数向量快约100倍。我希望填充整数向量要快得多,因为向量在内存中是连续的,并且插入更快。

如何填充列表100倍,而不是填充矢量快10倍。我确信我错过了一些导致这个问题的概念或想法

这是我用于生成结果的代码

#include <iostream>
#include <sstream>
#include <list>
#include <vector>
#include <ctime>
#include <time.h>

using namespace std;



int main()
{
   list<int> mylist;
   vector<int> myvector;
   srand(time(NULL));
   int num;

   clock_t list_start;
   clock_t list_end;
   clock_t list_totaltime;

   for (int i=0;i<100;i++)
   {

    list_start = clock();

        for (int i = 0 ; i < 10000000 ; i++ ) // 10 million
        {    
            num = rand() % 10000000 ; 

            mylist.push_back(num);
         }

    list_end = clock();

    list_totaltime += difftime(list_end,list_start);

    mylist.clear();

   }

   cout << list_totaltime/CLOCKS_PER_SEC/100;

   cout <<" List is done ";

   cout << endl
        << endl;

   clock_t vector_start;  
   clock_t vector_end;
   clock_t vector_totaltime;

   for (int i=0;i<100;i++)
   {

    vector_start = clock();

        for (int i = 0 ; i < 10000000 ; i++ ) // 10 million times
        {    
            num = rand() % 10000000 ; 

            myvector.push_back(num);
        }

    vector_end = clock();

    vector_totaltime += difftime(vector_end,vector_start);

    myvector.clear();

    }

   cout << vector_totaltime/CLOCKS_PER_SEC/100;

   cout << " Vector is done " ;


}

有人可以向我解释为什么会这样吗???

5 个答案:

答案 0 :(得分:2)

我尝试使用VS2013 C ++编译器, std::vector比<{1}} 更快 (正如我所料)。

我得到了以下结果:

std::list

我使用Windows 高分辨率性能计数器来测量时间 当然,我在优化 发布版本中进行了测试。

我还重构了回推循环中的随机数生成,并使用了more serious random number technique than rand()

您使用Testing STL vector vs. list push_back() time -------------------------------------------- Testing std::vector...done. std::vector::push_back(): 89.1318 ms Testing std::list...done. std::list::push_back(): 781.214 ms 的方法是否有助于衡量执行时间?

你使用了什么C ++编译器?您是否测试了优化的构建?

可编辑的测试代码如下:

clock()

答案 1 :(得分:1)

  

有人可以向我解释为什么会这样吗???

结果不真实,即填充整数列表比填充整数向量快100倍。由于pointed out中代码comments中的错误,您看到的是基准工件。

如果初始化变量并避免整数除法,那么你会看到不同的结果,例如,在我的机器上填充向量比填充列表快3倍(顺便说一下,调用vector::reserve()对结果没有影响)。

相关:Fun with uninitialized variables and compiler (GCC)

此外,您不应将difftime(time_t, time_t)clock_t值一起使用。

答案 2 :(得分:1)

对于记录,在修复未初始化的变量问题和整数除法之后,运行在x86_64上使用gcc 4.7.3编译的优化版本以及以下标志

  

g ++ -Wall -Wextra -pedantic-errors -pthread -std = c ++ 11 -O3

我得到了

0.2 List is done 
0.07 Vector is done

因此,矢量更快,正如我所料。这没有对代码进行任何进一步的更改。

答案 3 :(得分:0)

向量中的元素按顺序存储在连续的内存位置。最初,一些内存被分配给向量,当你不断向向量添加更多元素时,必须有很多内存操作来保留 vector 的这个属性。这些内存操作需要相当长的时间。

列表的情况下,磁头存储第二个的地址,第三个元素的地址存储在第三个,依此类推。这里不需要任何内存重新分配。

但与矢量相比,列表需要更多存储空间

答案 4 :(得分:-1)

如果向量的大小超过其容量,则需要重新分配向量。在这种情况下,必须将所有先前的值复制到新存储。 尝试使用vector::reserve增加容量以减少所需的重新分配。