- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我对 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
对于标准 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 、字符等)。您也可以选择使用不同数量的可用堆栈空间来完成所有这些操作。如果您不考虑所有因素,那么默认情况下您的问题将变为“为什么在我的特定情况下存在速度差异?”通常很难说。
一个更好的问题可能是,“我在各种测试条件下观察到这两段功能相似的代码之间存在速度差异。它们之间是否存在一些架构差异可以解释这一点?”答案是可能。
Internally, vectors use a dynamically allocated array to store their elements. This array may need to be reallocated in order to grow in size when new elements are inserted, which implies allocating a new array and moving all elements to it. This is a relatively expensive task in terms of processing time, and thus, vectors do not reallocate each time an element is added to the container.
Instead, vector containers may allocate some extra storage to accommodate for possible growth, and thus the container may have an actual capacity greater than the storage strictly needed to contain its elements (i.e., its size). Libraries can implement different strategies for growth to balance between memory usage and reallocations, but in any case, reallocations should only happen at logarithmically growing intervals of size so that the insertion of individual elements at the end of the vector can be provided with amortized constant time complexity (see push_back).
由此我们可以看出,您所看到的行为取决于您所使用的 STL 库的特定版本,并且增长应该是对数的,而且这种增长通常需要大量复制。 deque不需要大量复制,因此它可以在您的测试中更好地扩展。
据推测,boost::container
的功能类似。我不知道,因为我找不到关于它的文章。但我确实找到了this :
All containers offered by Boost.Container implement placement insertion, which means that objects can be built directly into the container from user arguments without creating any temporary object. For compilers without variadic templates support placement insertion is emulated up to a finite (10) number of arguments.
如果 std::vector 不使用类似的架构而是创建一个临时对象,这可能会导致运行时的差异。但这可能不适用于 int
类型。也许其他人可以找到不同的架构差异。
关于c++ - boost::container::vector 比 std::vector 快吗?为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14128012/
我有这个析构函数,它在运行时产生错误“vector 迭代器不可取消引用”。 gridMatrix 是一个 std::vector * > * > * > * > 我添加了 typename 和 typ
我有一个 vector 的 vector ,比方说 std::vector > my2dArray; 现在我想要一个 vector ,其中包含 my2dArray 中 vector 的大小。手动这看起
假设我有一些 vector :v1、v2、v3 假设我还有一个 vector 来保存这些 vList = {v1, v2, v3} 如果我同步了 (vList),这是否意味着 v1、v2 和 v3 也
我正在创建一个 char 的二维 vector 数组作为类变量,但我在将 vector 添加到 vector 数组中时遇到了麻烦。 我正在使用 C++ 11 标准运行 gcc。 我尝试使用 vecto
如何修改 Vec基于 Vec 中某项的信息没有对向量的不可变和可变引用? 我已尝试创建一个最小示例来演示我的特定问题。在我的真实代码中,Builder struct 已经是其他答案提出的中间结构。具体
这个问题在这里已经有了答案: What is the idiomatic Rust way to copy/clone a vector in a parameterized function? (
在我的程序中,我有一个整数 vector 的 vector 。现在我想从 vector 的 vector 中取出一个 vector 并在另一个 vector 容器中对其进行操作,但是我得到了错误...
我得到一个vector>数据由 OpenCV 提供。由于某些原因(例如偏移/缩放),我需要转换数据 Point至Point2f 。我怎样才能做到这一点? 例如: std::vector > conto
我有一个函数,该函数应使用来自字符串类型的给定 vector vector 中的某些元素初始化来自字符串类型的空 vector vector 。我的语法看起来像这样 std::vector> extr
我得到一个vector>数据由 OpenCV 提供。由于某些原因(例如偏移/缩放),我需要转换数据 Point至Point2f 。我怎样才能做到这一点? 例如: std::vector > conto
这里有很多类似的问题,但我没有真正找到任何可以特别回答我的问题的问题。 我有一个 vector 的 vector 作为类的属性。另一个属性是 bucket_count。我想将 vector 的 vec
如果我像这样创建一个 vector 的 vector : std::vector> myVectorOfVectors; 然后用一些东西填充它: std::vector myVector1; myVe
我正在用 C++ 编写自定义 vector 类。我对这样的代码有疑问: vector vec; vec.push_back(one); vec.push_back(two);
这是我发布的问题 c++ program for reading an unknown size csv file (filled only with floats) with constant (b
vector> a; for (int i=0;i v(i+1); iota(v.begin(),v.end(),1); a.push_back(v); } a.erase(a.beg
也许已经晚了,但我不明白为什么我会得到一个超出此代码范围的 vector 下标: int m = 3; int n = 2; std::vector> path(m, std::vector(n, 0
这个问题真的很奇怪,我似乎找不到任何导致它的原因。 所以这里有一个赋值运算符重载函数,鸟类和哺乳动物都是 vector 。 (下面是类) const Register& Register::opera
我怎么去 std::vector> 只是 std::vector> ?有真正有效的方法吗? 最佳答案 我会做这样的事情: #include #include int main() { //
我正在尝试将这些 vector 中的一些数据写入文本文件。当我运行代码时,它返回运行时错误。 Category、Product、Cart、Customer和Address都是struct 包含每个 g
显然它会因您使用的编译器而异,但我很好奇执行 vector> 时的性能问题与 vector*> ,尤其是在 C++ 中。具体来说: 假设您的外部 vector 已满,您想要开始将元素插入到第一个内部
我是一名优秀的程序员,十分优秀!