我正在比较使用整数向量填充整数列表所花费的时间。
每个载体& 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 " ;
}
有人可以向我解释为什么会这样吗???
答案 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
增加容量以减少所需的重新分配。