对于相同大小的小对象,非常快的对象分配器
Very fast object allocator for small object of same size
我只需要编写一些必须具有最佳性能的代码。
要求:
我需要一个非常快的对象分配器来快速创建对象。我的对象只有3个double。一次只能对一个对象进行分配和回收。
我做了大量的研究,并提出:
std::vector<MyClass, boost::fast_pool_allocator<MyClass>>
I wonder (in 2014-07):
- stl有类似boost::boost:fast_pool_allocator的东西吗?
- 有更好的解决方案吗?
有额外的信息来回答一些评论:
- 代码将用于优化我的算法:代码项目文章在凸壳
- 我需要将c#代码转换为C或c++以提高性能。我应该和另一个用纯"c"写的算法竞争。我刚刚发现我的文章中的比较图表有错误,因为我测试了用C编译的用于x86-Debug的代码。在x64中,释放"代码更快(比在x86-debug中快4到5倍)。
- 根据Boost文档和StackOverFlow的答案,Boost:fast_pool_allocator似乎是用于相同大小的小内存块逐个查询的最佳分配器。但我想确保没有其他东西存在,要么更标准(stl的一部分)或更快。
- 我的代码将在Visual Studio 2013上开发,并针对任何windows平台(没有手机或平板电脑)。
- 我的意图不是要有快速的代码,而是要有最快的代码。如果可能的话,我更喜欢不要有太多扭曲的代码,也要寻找可维护的代码(至少是最小的)。
- 如果可能的话,我也想知道使用std:vector vs array(即:[])的影响。 要了解更多信息,您可以查看Wikipedia -对象池模式
最接近我所寻找的是Paulo Zemek代码项目的文章:c++中的0(1)对象池。
但我最终分配/保留内存的大小=最大可能的大小*我的对象大小。因为我没有使用任何需要比我的算法循环更长的对象,所以我骗了我,说保留内存空间中的位置是object。在我的算法循环之后,我刷新了保留的内存空间。在我看来它是最快的。非常不优雅,但非常快,只需要一次分配和一次释放。
我对答案并不完全满意,所以我回答了自己。我还为每个评论的问题添加了评论,并添加了这个答案,使我的想法清晰。我知道我的决定/执行并不完全符合问题,但我认为它应该是类似的。
查找内存池堆。基本上,您创建一个专用于单一大小对象的堆(通常是2、4字节、16字节等),并从堆中分配对象,这些对象可以包含可以容纳您的对象的最小大小的块。由于每个堆只包含固定大小的块,因此管理其中分配的块非常容易,位图可以显示哪些块是空闲的或正在使用的,因此插入可以非常快(特别是如果您只是在末尾分配并增加一个指针)
作为一个例子,这里有一个,您可以采用它并针对您的特定对象大小和要求显式地优化它。
我发现这个解决方案对我非常有用:STL容器的快速c++ 11分配器。它略微加快了VS2017 (~5x)和GCC (~7x)上的STL容器的速度。此外,您可以手动指定增长大小,或者如果您知道列表中元素的最大数量,则可以预先分配它们。
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 是否可以使用分配器对象来释放另一个分配器分配的内存?
- C++ 如何在容器类复制构造函数中复制分配器对象
- 分配分配器为多态对象分配内存
- 供应商是否将 new 和 malloc 实现为小型对象分配器
- 在C++中使用不同的分配器复制对象
- 使用自定义分配器调用对象构造函数/析构函数
- 自定义分配器,用于将stl矢量存储在OpenGL缓冲区对象中
- 对于相同大小的小对象,非常快的对象分配器
- 什么是 vector<char,分配器 > 类型的C++对象<char>,如何使用它?
- 如何在使用分配器概念时避免堆栈上的临时对象
- std::vector *必须*在增加容量时移动对象吗?或者,分配器可以"reallocate"吗?
- 引用std::basic_string特化string与自定义分配器作为std::string的常量对象,没有开销
- 分配器中的每对象数据
- 处理使用boost::进程间STL兼容共享内存分配器创建的c++对象的正确方法是什么?
- 有没有比编写存储对有状态分配器对象的引用的包装器分配器更好的方法
- 在 std::分配器重新绑定上转移对象所有权
- 洛基的记忆小对象分配器