内存分配/释放瓶颈?

在典型的真实世界的程序中,内存分配/释放有多大瓶颈? 来自任何性能通常很重要的程序的答案都是受欢迎的。 malloc / free / garbage collection的体面实现是否足够快,以至于它只是一些特定情况下的瓶颈,或者大多数性能关键型软件会从试图保持内存分配量减少或拥有更快的malloc / free /垃圾收集实施?

注意:我不是在这里讨论实时的东西。 对性能至关重要,我的意思是吞吐量很重要,但延迟并不一定。

编辑:虽然我提到malloc,但这个问题并不打算成为C / C ++特有的。


这非常重要,特别是在碎片增长和分配器不得不在您所请求的连续区域的更大堆中寻找困难时。 大多数对性能敏感的应用程序通常编写自己的固定大小的块分配器(例如,他们一次向操作系统请求16MB的内存,然后将其打包在4kb,16kb等固定块中)以避免此问题。

在游戏中,我看到malloc()/ free()的调用消耗了CPU的15%(在写得不好的产品中),或者使用精心编写和优化的块分配器,只有5%。 考虑到游戏必须具有60赫兹的一致吞吐量,在垃圾收集器偶尔运行的情况下使其失速500毫秒并不实际。


几乎每个高性能应用程序现在都必须使用线程来利用并行计算。 这是编写C / C ++应用程序时真正的内存分配速度杀手所在的地方。

在C或C ++应用程序中,malloc / new必须为每个操作锁定全局堆。 即使没有争用锁也远没有免费,应该尽可能避免。

Java和C#在这方面更好,因为线程是从一开始就设计的,内存分配器从每个线程池开始工作。 这也可以在C / C ++中完成,但它不是自动的。


首先,因为你说malloc,我假设你在谈论C或C ++。

内存分配和释放往往是真实世界程序的一个重要瓶颈。 当你分配或释放内存时,很多情况都是“隐藏的”,并且所有内容都是系统特定的; 内存可能实际上被移动或碎片整理,页面可能被重新组织 - 没有平台无关的方式来知道影响会是什么。 某些系统(如许多游戏控制台)也不会执行内存碎片整理,因此在这些系统上,随着内存变得分散,您将开始发生内存不足错误。

一个典型的解决方法是尽可能多地分配内存,然后继续执行,直到程序退出。 您可以使用该内存来存储庞大的整体数据集,也可以使用内存池实现以块的形式进行分配。 正是出于这个原因,许多C / C ++标准库实现会自行执行一定数量的内存池。

尽管如此,没有两种方法 - 如果您有一个时间敏感的C / C ++程序,那么执行大量内存分配/释放操作会导致性能下降。

链接地址: http://www.djcxy.com/p/85957.html

上一篇: Memory Allocation/Deallocation Bottleneck?

下一篇: what's wrong with my stat() function in C in linux