【问题标题】:Realloc Vs Linked List ScanningRealloc 与链表扫描
【发布时间】:2011-08-23 09:03:17
【问题描述】:

我必须从文件中读取未知数量的行并将它们保存到一个结构中(我想避免计算元素总数)。 在阅读阶段之后,我必须对这些行的每个元素进行一些计算。

我想出了两种方法:

  1. 每次阅读一行时使用realloc。这种方式分配阶段很慢,但由于索引访问,计算阶段更容易。

  2. 每次读取一行时使用一个链表。这样分配阶段比较快,但计算阶段比较慢。

从复杂性的角度来看,什么更好?

【问题讨论】:

  • 用于读取的链接列表,然后用于计算的mallock'ing?

标签: c linked-list realloc


【解决方案1】:

正如其他用户已经说过的那样:

过早的优化是 万恶之源

唐纳德·高德纳

我有一个使用 realloc 的不同建议:在 C++ STL 中,std::vector 容器在每次插入对象时都会增长,并且没有足够的可用空间。增长的大小取决于当前预分配的大小,但特定于实现。例如,您可以保存预分配对象的实际数量。如果大小用完,则调用 reallocate 并使用当前分配的双倍空间。我希望这有点可以理解!

当然,需要注意的是,您分配的空间可能比实际消耗和需要的空间多。

【讨论】:

  • 万恶之二是跳过“理论”课程,完全放弃优化,用 3 年的时间编写 5000 万行时髦代码,比简单的 C 慢 10,000 倍,每次都惨败达到规模限制的时间,每十几年左右就会导致投资者对整个科技行业失去信心……
  • 赞成您的答案,并且正在实施这种方式。我要说的是:优化代码就是你如何“获得 gud”的方式,而 DKnuth meme 可能已经过时了,因为这些天那里有一些噩梦般的 python。
【解决方案2】:

如果不详细说明您将如何使用这些信息,就很难评论其复杂性。但是,这里有一些想法:

  • 如果您使用 realloc,最好使用 realloc 添加“一些”更多项目(而不是每次都添加一个)。通常,一个好的算法是每次将大小加倍。
  • 如果您使用链表,您可以通过简单的后处理步骤加快访问速度。分配一个指向项目的指针数组,并在将数组元素设置为列表中的每个项目后遍历列表。
  • 如果文件中的项目具有固定大小,您可以预先计算大小,只需查找文件末尾,确定大小,除以项目大小即可得到结果。即使它不是固定大小,您也可以将其用作估计值,以“接近”必要的大小并减少所需的重新分配数量。

【讨论】:

    【解决方案3】:

    你会多久遍历一次链表?如果它只是一次去链表。另外几件事:会有很多小分配吗?您可以为假设 10 行创建一些较小的缓冲区并将它们链接在一起。但这都是剖析的问题。

    我会先做最简单的事情,看看是否符合我的需要,然后我才会考虑优化。

    有时即使第二个最佳解决方案也完全符合需求,也会浪费太多时间考虑最佳解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-04
      • 2020-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多