C++ 矢量与Deque插入时间
我读了一篇很好的实验,特别是比较了在C++ 矢量与Deque插入时间,c++,vector,stl,containers,deque,C++,Vector,Stl,Containers,Deque,我读了一篇很好的实验,特别是比较了在vector和deque容器上调用insert()的性能。该特定实验(实验4)的结果是,deque在该操作中具有显著优势 我使用自己编写的一个简短的排序函数实现了自己的测试,应该注意的是,它使用了[]操作符和其他成员函数,并发现了截然不同的结果。例如,对于插入100000个元素,vector需要24.88秒,而deque需要374.35秒 我怎么解释呢?我想这与我的排序功能有关,但我想知道细节 我使用的是没有优化的g++4.6 节目如下: #include &
vector
和deque
容器上调用insert()
的性能。该特定实验(实验4)的结果是,deque
在该操作中具有显著优势
我使用自己编写的一个简短的排序函数实现了自己的测试,应该注意的是,它使用了[]
操作符和其他成员函数,并发现了截然不同的结果。例如,对于插入100000个元素,vector
需要24.88秒,而deque
需要374.35秒
我怎么解释呢?我想这与我的排序功能有关,但我想知道细节
我使用的是没有优化的g++4.6
节目如下:
#include <iostream>
#include <vector>
#include <deque>
#include <cstdlib>
#include <ctime>
using namespace std;
size_t InsertionIndex(vector<double>& vec, double toInsert) {
for (size_t i = 0; i < vec.size(); ++i)
if (toInsert < vec[i])
return i;
return vec.size(); // return last index+1 if toInsert is largest yet
}
size_t InsertionIndex(deque<double>& deq, double toInsert) {
for (size_t i = 0; i < deq.size(); ++i)
if (toInsert < deq[i])
return i;
return deq.size(); // return last index+1 if toInsert is largest yet
}
int main() {
vector<double> vec;
deque<double> deq;
size_t N = 100000;
clock_t tic = clock();
for(int i = 0; i < N; ++i) {
double val = rand();
vec.insert(vec.begin() + InsertionIndex(vec, val), val);
// deq.insert(deq.begin() + InsertionIndex(deq, val), val);
}
float total = (float)(clock() - tic) / CLOCKS_PER_SEC;
cout << total << endl;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
大小插入索引(向量和向量,双输入){
对于(大小i=0;i cout特殊情况下,deque
比vector
快得多是在容器前面插入。在这种情况下,您在随机位置插入,这实际上会使vector
具有优势
另外,除非您使用的是优化的构建,否则很可能在库实现中存在边界检查。这些检查会显著增加时间。要进行正确的基准比较,您必须在打开所有正常优化并关闭调试的情况下运行。您的代码正在执行插入排序,这是O(n^2).在deque
上迭代比在向量上迭代要慢
我怀疑您没有看到与发布的链接相同的结果的原因是,您的程序的运行时主要由InsertionIndex
中的循环控制,而不是调用deque::insert
(或vector::insert告诉我们:1)您使用的编译器和2)不管你是否在测试一个优化的构建。只是补充说我使用的是没有优化的g++版本,但我不确定如何找出我使用的是哪个g++版本。很酷,谢谢。双精度向量可能会更快,但是如果类类型大,deque肯定会使用fasterOk,谢谢。我的编译器命令是g++filename.cpp
。我是否需要添加任何东西来关闭调试,以及我应该使用哪种优化?例如,-o2?@bcf:对于gcc,默认实现不使用选中迭代器,因此只需将优化器升级(-o2或-O3)应该足够了。但是比较中的重要部分是Mark在第一段中提到的内容。deque的优点是在前面插入和删除(您链接的文章中顺便提到了这一点)