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

时间:2014-07-31 21:52:55

标签: c++ arrays performance boost stl

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

要求:

我需要一个非常快速的对象分配器来快速创建对象。我的对象只有3个双打。分配和取消分配将一次只发生一个对象。

我进行了大量研究并提出:

std:vector<MyClass, boost:fast_pool_allocator<MyClass>>

我想知道(在2014-07):

  • stl是否具有与boost :: boost:fast_pool_allocator相同的东西?
  • 我找到的是否有更好的解决方案?

还有其他信息可以回答一些意见:

  • 该代码将用于优化我的算法:Code Project article on Convex Hull
  • 我需要将C#代码转换为C或C ++以提高性能。我应该与另一种用纯&#34; C&#34;编写的算法竞争。我刚刚发现我的文章中的比较图表有错误,因为我测试了用C编译的x86-Debug代码。在x64版本中,&#34; C&#34;代码快得多(比x86-debug快4到5倍)。
  • 根据This Boost documentation和此Answer at StackOverFlow,boost:fast_pool_allocator似乎是用于逐个查询相同大小查询的小内存块的最佳分配器。但我想确保没有其他任何东西可以更标准(stl的一部分)或更快。
  • 我的代码将在Visual Studio 2013上开发,并以任何Windows平台(无手机或平板电脑)为目标。
  • 我的意图是没有快速代码,而是拥有最快的代码。如果可能的话,我不希望有太多扭曲的代码,并且还要寻找可维护的代码(至少是最小的)。
  • 如果可能的话,我也想知道使用std:vector vs array(即:[])的影响。
  • 有关详细信息,您可以看到Wikipedia - Object pool pattern

3 个答案:

答案 0 :(得分:1)

搜索memory-pool heaps。基本上,您创建一个专用于单个大小的对象(通常为2,4字节,16字节等的对象)的堆,并从堆中分配对象,该对象可以包含可以适合您的对象的最小大小的块。堆只包含固定大小的块,它很容易管理在其中分配的块,位图可以显示哪些块是空闲的或正在使用,因此插入可以非常快(特别是如果你只是在最后分配和增加一个指针)

作为示例,here's one,您可以采用它并针对特定对象大小和要求明确优化它。

答案 1 :(得分:1)

最接近我所寻求的是Paulo Zemek Code Project文章:O(1) Object Pool in C++

但我终于分配/保留了size =可能的最大大小*我的对象大小的内存。 因为我没有使用任何需要比我的算法循环更长寿的对象,所以我欺骗说保留的内存空间中的位置是对象。在我的算法循环之后,我刷新了保留的内存空间。在我看来,它是最快的。非常不优雅,但非常快,只需要一次分配和一次释放。

我对答案并不完全满意,这就是我回答自己的原因。我还对每个评论的问题添加了评论,并添加了这个答案以使思考清晰。我知道我的决定/实施并不完全符合这个问题,但我认为应该采取类似的措施。

答案 2 :(得分:0)

我发现这个解决方案对我非常有用:Fast C++11 allocator for STL containers。它在VS2017(~5x)以及GCC(~7x)上略微加速STL容器。此外,您可以手动指定增长大小,或者如果您知道列表中的最大元素数,则可以预先分配它们。