繁体   English   中英

boost :: container :: vector比std :: vector快吗? 为什么?

[英]Is boost::container::vector faster than std::vector? Why?

我对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);
    }
}

win32版本,由vc2010,/ O2 / Oy-编译

对于N = 10000

对于标准向量:壁为0.140849s,用户为0.140401s + 0.000000s系统= 0.140401s CPU(99.7%)

f提升向量:壁0.056174s,用户0.062400s + 0.000000s系统= 0.062400s CPU(111.1%)

对于N = 100,000

标准:14.050757s墙,14.055690s用户+ 0.000000s系统= 14.055690s CPU(100.0%)

提升:墙壁5.585048s,用户5.584836s + 0.000000s系统= 5.584836s CPU(100.0%)

当两者都添加reserve(N)时,CPU时间几乎不变。

他们之间有什么区别吗? Boost比std快得多,为什么? 谢谢。

检查sizeof(),std :: vector 16,而boost :: container :: vector 12。

请记住,所有代码的速度将因编译器的不同以及该编译器的版本而异。 标准库提供了可在平台之间移植的代码,但是很难保证速度。

如果只在自己的计算机上运行此代码,则应选择更快的选项。 如果您因为要做出更快的选择而问这个问题,那么我认为没有一种方法可以知道缺少测试的方法。

自然地,当您似乎以一种通用的方式想知道速度时,您需要评估一下是否可以插入许多不同数量的对象,运行许多重复测试以及使用各种对象(类,双精度,字符等)。 您也可以选择使用不同数量的可用堆栈空间来完成所有这些操作。 如果您没有考虑所有因素,那么默认情况下您的问题将变成:“为什么在我的特定情况下,速度会有差异?” 通常很难说。

一个更好的问题可能是:“我在各种测试条件下都观察到这两个功能相似的代码之间的速度差异。它们之间是否存在一些体系结构差异?” 答案可能是。

std :: vector上的cplusplus.com

向量在内部使用动态分配的数组存储其元素。 插入新元素时,可能需要重新分配该数组以增大大小,这意味着分配新数组并将所有元素移至该数组。 就处理时间而言,这是一项相对昂贵的任务,因此,每次将元素添加到容器时,向量都不会重新分配。

取而代之的是,矢量容器可能会分配一些额外的存储空间以适应可能的增长,因此,该容器的实际容量可能大于包含其元素(即其大小)所严格要求的存储容量。 库可以实现不同的增长策略,以在内存使用和重新分配之间取得平衡,但是在任何情况下,重新分配仅应以大小的对数增长间隔进行,以便可以在向量末尾插入单个元素并提供摊销的恒定时间。复杂度(请参见push_back)。

由此可见,您所看到的行为取决于您所使用的STL库的特定版本,并且增长应该是对数的,并且增长通常需要大量复制。 双端队列不需要大量复制,因此在测试中可以更好地扩展。

大概, boost::container功能类似。 我不知道,因为我找不到关于它的书面记录。 但是我确实发现了这一点

Boost.Container提供的所有容器都实现插入位置,这意味着可以从用户参数直接将对象内置到容器中,而无需创建任何临时对象。 对于没有可变参数模板的编译器,支持最多模拟有限个(10)参数的位置插入。

如果std :: vector不使用类似的体系结构,而是创建一个临时对象,则可能导致运行时差异。 但这可能不适用于int类型。 也许其他人可以找到不同的体系结构差异。

boost :: container中的容器类大量使用了扩展的分配器,这些分配器不仅允许分配和取消分配,构造和解构,而且还尽可能扩展分配的内存块。 这意味着在许多情况下,复制较少,并且实际上在c ++中的效果与在c中可以实现的效果相当:

char * data;
char * newdata = malloc(newdatasize);
memcpy(newdata,data,datasize);
swap(data,newdata);
free(newdata);

https://www.boost.org/doc/libs/1_68_0/doc/html/container/extended_allocators.html插入int时,没有一个“放置插入”优化是有意义的,因为int的构造很简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM