哪种内存分配算法最适合性能和时间关键的c ++应用程序?

bar*_*noz 15 c++ performance memory-management memory-fragmentation

我问这个问题,以确定哪种内存分配算法可以为性能关键应用程序(如游戏引擎或嵌入式应用程序)提供更好的结果.结果实际上取决于内存碎片的百分比和内存请求的时间决定性.

教科书中有几种算法(例如Buddy内存分配),但也有其他像TLSF.因此,关于可用的内存分配算法,哪一个是最快的并且导致更少的碎片.顺便说一句,垃圾收集者不应包括在内.

还请注意,这个问题不是关于分析,它只是为了找出给定要求的最佳算法.

Max*_*ert 15

这一切都取决于应用程序.例如,可以在定义的时刻清除与特定请求相关的所有存储器的服务器应用程序将具有与视频游戏不同的存储器访问模式.

如果有一个内存分配算法总是最好的性能和碎片,人们不会实现mallocnew总是选择该算法?

如今,通常最好假设编写操作系统和运行时库的人没有脑死亡; 除非你有一些不寻常的内存访问模式,否则不要试图击败它们.

相反,尝试减少您所做的分配(或重新分配)的数量.例如,我经常使用a std::vector,但如果我提前知道它将具有多少元素,我可以一次性保留所有元素.这比通过多次调用"自然地"增长更有效push_back().

很多人来自new只是意味着"给对象"的语言,他们会毫无理由地分配东西.如果您不必将它放在堆上,请不要调用new.

至于碎片化:它仍然取决于.不幸的是我现在找不到这个链接,但是我记得微软的一篇博客文章发表了一篇关于C++服务器应用程序的博客文章.团队通过从两个区域分配内存来解决问题.所有请求的内存都来自区域A,直到它满了(请求将正常释放内存).当区域A已满时,将从区域B分配所有存储器.到区域B已满时,区域A再次完全为空.这解决了他们的碎片问题.

它会解决你的问题吗?我不知道.您是否在为一个服务于多个独立请求的项目工作? 你在做游戏吗?

至于决定论:它仍然取决于.你的截止日期是什么时候?当你错过最后期限时会发生什么(宇航员在太空中丢失?播放的音乐听起来像垃圾一样?)?有实时分配器,但请记住:"实时"意味着"承诺满足最后期限",不一定"快".

我刚刚看到一篇帖子描述了Facebook为加速和减少jemalloc中的碎片所做的各种事情.您可能会发现讨论很有趣.

  • 与所有其他参数一样,碎片取决于应用程序.例如,证明如果所有分配大小相同(例如16个字节),那么就不会发生碎片(给定一个合理的中间分配器). (3认同)

Som*_*ter 5

巴里斯:

你的问题非常笼统,但这是我的答案/指导:

我不了解游戏引擎,但对于嵌入式和实时应用程序,分配算法的一般目标是:

1-有限执行时间:您必须事先知道最坏情况分配时间,以便相应地规划实时任务.

2-快速执行:显然,越快越好

3-始终分配:特别是对于实时的安全关键应用程序,必须满足所有请求.如果你请求一些内存空间并得到一个空指针:麻烦!

4-减少碎片:虽然这取决于所使用的算法,但通常,由于多种原因(包括缓存效应),较少碎片化的分配可提供更好的性能.

在大多数关键系统中,不允许动态分配任何内存.您可以分析您的需求并确定最大内存使用量,并在应用程序启动后立即分配大量内存.如果你不能,那么应用程序甚至不启动,如果它确实启动,则在执行期间不会分配新的内存块.

如果速度是一个问题,我建议采用类似的方法.您可以实现管理内存的内存池.池可以在应用程序启动时初始化"足够"的内存块,并从此块提供内存请求.如果您需要更多内存,则池可以执行另一个 - 可能是大量分配(预计会有更多内存请求),并且您的应用程序可以开始使用这个新分配的内存.还有各种内存池方案,管理这些池是另一个完整的主题.

至于一些例子:VxWorks RTOS用于采用第一拟合分配算法,其中算法分析链表以找到足够大的空闲块.在VxWorks 6中,他们使用的是最合适的算法,其中可用空间保存在树中,并且分配遍历树以获得足够大的空闲块.有一篇名为Memory Allocation in VxWorks 6.0Zoltan Laszlo的白皮书,你可以通过Googling找到它,它有更多的细节.

回到你关于速度/碎片的问题:这实际上取决于你的应用程序.需要考虑的事项是:

  • 您是要进行大量非常小的分配,还是相对较大的分配?

  • 分配是爆发,还是在整个申请中平均分配?

  • 分配的生命周期是多少?

如果您要问这个问题是因为您要实现自己的分配器,那么您应该以可以更改基础分配/释放算法的方式设计它,因为如果速度/碎片在您的实际上非常重要应用程序,您将要尝试不同的分配器.如果我在不知道你的任何要求的情况下推荐一些东西,我会从TLSF开始,因为它具有良好的整体特性.