我对boost vector 和std vector 做了如下有趣的测试

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

对于std vector :墙壁0.140849s,用户0.140401s + 0.000000s系统= 0.140401s CPU(99.7%)

f boost vector :壁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%)

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

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

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

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

最佳答案

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

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

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

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

cplusplus.com on std::vector



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

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



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

关于c++ - boost::container::vector比std::vector快吗?为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14128012/

10-11 22:36
查看更多