我不熟悉如何分配Linux堆。
我每秒多次调用malloc()/ free(),总是使用相同的大小(大约有10个结构,每个都是固定大小)。除了初始时间,我的记忆都没有长时间分配。
这被认为是标准堆的不良形式吗? (我相信有人会问'你在用什么堆?' - '呃。标准静态堆'..意思是我不确定。)
我是应该使用空闲列表还是堆容忍大量相同的分配。我试图平衡可读性和性能。
有哪些工具可以帮助我衡量?
答案 0 :(得分:11)
首先,除非你有测量内存使用量爆炸的问题,否则不要考虑使用自定义分配器。这是过早优化的最糟糕形式之一。
同时,即使你确实遇到了问题,一个比自定义分配器更好的解决方案就是弄清楚你为什么要分配和释放对象这么多,并解决造成它的设计问题。
为了解决您的具体问题,glibc的分配器基于dlmalloc算法,该算法在碎片方面几乎是最优的。唯一能让它严重破坏内存的方法是不可避免的方式:通过在交替中分配具有完全不同的生命周期的对象,例如:分配大量对象但只释放其他对象。我认为你将很难制定出一种分配模式,这种分配模式会使总内存使用量低于池......
答案 1 :(得分:4)
Valgrind有一个用于测量内存使用情况的特殊工具Massif。这应该有助于分析堆分配。
答案 2 :(得分:0)
我认为最佳性能优化是尽可能避免堆分配(并且合理)。每当一个对象被分配堆栈时,编译器只会向上移动堆栈指针,而不是试图找到一个空闲点或将分配的内存返回到某个空闲列表。
如何定义结构的生命周期?如果你可以通过范围来表达你的对象生命周期,那么这确实会提高性能。