C 中并发数据结构的内存消耗



我想知道给定的数据结构消耗了多少内存。所以假设我有一个并发链表。我想知道这个清单有多大。我有几个选择:malloc_hooks,我认为不是线程安全的,getrusageru_maxrss,但我真的不知道这给了我什么(整个过程在执行过程中消耗了多少内存?我想知道是否有人真的以这种方式测量了内存消耗。有没有工具可以做到这一点?massif如何?

要了解malloc某些结构(如链表节点)的实际成本,请创建一个独立的测试用例(非并发!)来分配数千个字节,并查看程序内存使用情况中的增量值。有多种方法可以做到这一点。如果你的库有一个mallinfo结构,比如在GNU/Linux系统上找到的GNU C库,你可以查看之前和之后的统计数据。另一种方法是跟踪程序的系统调用,以观察其从操作系统分配的模式。例如,如果我们分配 10,000,000 个列表节点,并且程序执行 sbrk() 调用大约 39,000 次,每次调用中进程的大小增加 8192 字节,那么这意味着列表节点占用 32 个字节、开销和所有。

请记住,在单个线程中分配数千个相同大小的对象并不能实际表示实际程序中的实际内存使用情况,其中包括碎片。

如果你想分配小结构,接近不浪费一个字节(或者不造成任何你不知道和控制的浪费),并控制碎片,那么从malloc(或你选择的系统分配器)分配大型对象数组并自己分解它们。malloc中仍有未知的开销,但它被划分为大量对象,因此可以忽略不计。

或者,通常,编写您自己的分配器,您详细了解其行为和开销,并且它本身从系统中获取大量内容。

概念上讲,您需要知道正在使用的项目数量。 然后,您需要知道数据结构中使用的每种不同数据类型的大小。您还必须考虑指针的大小或任何在某种程度上使用某种内存的东西。

然后,您可以想出如下所示的公式:

消耗= N *(大小(数据类型))。

因此,换句话说

,您要确保将任何数据类型(数据类型的大小)相加并将其乘以项目数。

最新更新