对于相同大小的小对象,非常快的对象分配器

Very fast object allocator for small object of same size

本文关键字:对象 分配器 非常 于相同      更新时间:2023-10-16

我只需要编写一些必须具有最佳性能的代码。

要求:

我需要一个非常快的对象分配器来快速创建对象。我的对象只有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容器的速度。此外,您可以手动指定增长大小,或者如果您知道列表中元素的最大数量,则可以预先分配它们。