use*_*020 4 c++ boost vector std
我对boost矢量和std矢量做了一个有趣的测试,如下所示
int N = 10000;
{
boost::timer::auto_cpu_timer t;
std::vector<int> v;
for (int i = 0; i < N; ++i)
{
v.insert(v.begin(), i);
}
}
{
boost::timer::auto_cpu_timer t;
boost::container::vector<int> v;
for (int i = 0; i < N; ++i)
{
v.insert(v.begin(), i);
}
}
Run Code Online (Sandbox Code Playgroud)
win32发布,由vc2010编译,/ O2/Oy-
对于N = 10000
对于std向量:0.140849s wall,0.140401s user + 0.000000s system = 0.140401s CPU(99.7%)
f boost vector:0.056174s wall,0.062400s user + 0.000000s system = 0.062400s CPU(111.1%)
对于N = 100,000
std:14.050757s wall,14.055690s user + 0.000000s system = 14.055690s CPU(100.0%)
提升:5.585048s墙,5.584836s用户+ 0.000000s系统= 5.584836s CPU(100.0%)
向两者添加保留(N)时,CPU时间变化不大.
他们之间有什么区别?Boost比std快得多,为什么?谢谢.
检查sizeof(),std :: vector 16,同时boost :: container :: vector 12.
请记住,所有代码的速度因编译器和编译器的版本而异.标准库提供了从平台到平台可移植的代码,但很难提供速度保证.
如果您只在自己的计算机上运行此代码,那么您应该选择更快的选项,如果这是您想要的.如果你问这个问题是因为你想做出一个普遍更快的选择,那么我认为没有办法知道什么是缺乏测试.
当然,当人们想象一般的速度,就像你似乎一样,你想要评估插入许多不同数量的对象,运行许多重复测试,并使用各种对象(类,双, chars等.您也可以选择使用不同数量的可用堆栈空间来完成所有这些操作.如果你不考虑所有因素,那么你的问题默认为"为什么,在我的特殊情况下,是否存在速度差异?" 通常很难说.
一个更好的问题可能是,"我已经在各种测试条件下观察到这两个类似功能代码之间的速度差异.它们之间是否存在一些架构差异,这可能是造成这种情况的原因?" 答案可能是.
在内部,向量使用动态分配的数组来存储它们的元素.可能需要重新分配此数组,以便在插入新元素时增大大小,这意味着分配新数组并将所有元素移动到该数组.就处理时间而言,这是相对昂贵的任务,因此,每次将元素添加到容器时,向量不会重新分配.
相反,向量容器可以分配一些额外的存储以适应可能的增长,因此容器可以具有大于包含其元素(即,其大小)严格需要的存储的实际容量.库可以实现不同的增长策略以在内存使用和重新分配之间取得平衡,但无论如何,重新分配只应以对数增长的大小间隔发生,以便在向量末尾插入单个元素可以提供摊销的常量时间复杂性(见push_back).
从中我们可以看到,您所看到的行为取决于您正在使用的STL库的特定版本,并且该增长应该是对数的,并且这种增长通常需要大量复制.一个双端队列不需要大量复制的,所以它可以扩展你的测试中表现更好.
据推测,boost::container功能类似.我不知道,因为我找不到它的记录.但我确实发现了这个:
Boost.Container提供的所有容器都实现了放置插入,这意味着可以从用户参数直接将对象构建到容器中,而无需创建任何临时对象.对于没有可变参数模板的编译器,支持放置插入被模拟到有限(10)个参数.
如果std :: vector不使用类似的体系结构而是创建临时对象,则可能导致运行时间的差异.但可能这不适用于int类型.也许其他人可以找到不同的架构差异.