【问题标题】:best allocation of memory最佳内存分配
【发布时间】:2012-11-08 11:24:32
【问题描述】:

我有 200 个组。每组有 100 台设备,即总共 20000 台设备分为 200 组,每组 100 台。

现在,当每个设备向服务器注册时,服务器会为该设备分配一个组 ID。 (100 个设备具有相同的组 id。)在稍后阶段,服务器发送具有组 id 的多播数据,以便将数据接收到具有该组 id 的所有设备。

问题是我需要为每个组分配一块内存(比如 25 字节)来存储数据,以便该组中的所有设备都使用该块进行处理。我的想法是分配一个大块(比如 25 * 200 = 5000 字节)并为每个组分配一个 25 字节的块(grp0 指向起始地址,grp1 指向起始+25 地址,依此类推)。

这是最好的方法吗?还有其他想法吗?

【问题讨论】:

  • 让我们看看:您想通过数组中的索引找到一个组g。这需要O(1) 时间 => 好。你想分配一个 5KB 的内存块。这不是太多=>好。确保分配 (200 * sizeof(struct group)) 字节,而不是 '5000' :)
  • 您所说的“最佳”是什么意思?哪种方式最好?

标签: c logic analytical


【解决方案1】:

对于你的例子,我会使用一个数组。

如果您的客户数量不变,分配单个块是最有效的方式:

  • 您只进行了一次 malloc 调用,而不是 100 次
  • 您可以避免与跟踪每个内存块分配的列表相关的开销
  • 您的数据保存在一块中,这使得处理器缓存更容易对其进行缓存,而 100 个小块放置在天知道的位置

也就是说,可能只有 100 个元素的差异可以忽略不计,但乘以 200 个组可以给你带来性能提升(真的取决于你如何使用数据结构)

如果是动态结构(例如,您的客户端连接和断开连接,因此它们并不总是 100 个),您应该使用链表 - 它会在需要时分配内存(因此您最终会得到 100 个不同的内存块)

【讨论】:

  • Plus:数组提供了空间局部性等优势(有利于缓存)。即便如此,我预计从 100 个元素的链表中间获取某些内容并通过数组中的偏移地址获取相同内容所需的周期数会有一个数量级的差异。
【解决方案2】:

正如 ArjunShankar 所说,您将花费 O(1) 时间来访问组内的设备,假设您不必处理太多即可找到特定设备(假设您必须找到它),这还不错.如果您打算同时处理它们并且数量增长很大(或者您的可用内存有限),您应该看看一些技术,例如磁盘分页。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2012-12-07
    • 1970-01-01
    • 2011-03-14
    相关资源
    最近更新 更多