c++ - 优化速度 : Queue of Vectors vs. vector 指针队列

标签 c++ vector stl

我正在尝试将 vector (实际上是管理 vector 的对象)存储到队列中,以便稍后处理它们。

这是我当前的实现:

// in constructor:  
q = new boost::lockfree::spsc_queue<MyObject>(num_elements_in_q);
// ...
bool Push(const MyObject& push_me) { return q->push(push_me); }
//  ...  
// in Pop() (i.e., this is how I pop stuff off of the queue)  
MyObject temp;  
q->pop(&temp);  

我想知道存储指针而不是对象是否有意义。新代码如下所示:

// in constructor:  
q = new boost::lockfree::spsc_queue<MyObject*>(num_elements_in_q);
// ...
bool Push(const MyObject& push_me) {
  MyObject* ptr = new MyObject(push_me);
  return q->push(push_me);  
}
//  ...  
// in Pop() (i.e., this is how I pop stuff off of the queue)  
MyObject* ptr;  
q->pop(&ptr);
//  do stuff with ptr
delete ptr;

就最小化推送操作所花费的时间而言,哪种方法最好?一般来说,最好是存储整个 MyObject 还是只存储指针(并动态分配内存)?我意识到通过存储整个 MyObject,仍然涉及动态内存,因为 MyObject 中的 vector 需要调整大小。

我的最终目标是以内存使用和 Pop() 执行所需的时间为代价(顶级版本需要Pop() 中的一个拷贝,通过使用指针来避免)。

感谢您的帮助。此外,我目前无法访问此系统上的分析器,否则我可能已经有了答案。

最佳答案

如果不实际测试,我会说使用 new 的内存分配比复制整个 MyObject 的成本更高。当然这取决于 MyObject 是如何实现的。

另一件需要考虑的事情是,假设 boost::lock_free 将数据存储在连续内存中,存储对象本身可能会给您带来更高的缓存命中率。因为你所有的对象都可以被 cpu 批量读取,因此一起存储在 L1 缓存中。使用指针将导致 CPU 从指针指向的内存中加载内容,并可能将队列中的其他元素踢出缓存。

当然,要 100% 确定您必须对其进行测量。

关于c++ - 优化速度 : Queue of Vectors vs. vector 指针队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28502517/

相关文章:

c++ - GLFW - 与 Visual Studio 2012 链接的问题

c++ - 如何在堆栈上分配指向指针的指针以及如何在堆上分配指针?

c++ - 将 unique_ptr 持有的数组 move 到 vector 的数组存储中

c++ - STL 列表 - 作为指针对象的数据类型

c++ - 替换 STL 字符串中的换行符

c++ - .net 中的私有(private)成员?

c++ - 为什么使用 std::ostream 和 friend 进行 << 运算符重载?

c++ - 多个数字范围的排列

c++ - "Normalize"使用 lambda 的 C++ 中的二维 vector

c++ - std::make_shared、std::unique_ptr 和移动构造函数