malloc cpu周期

Man*_*Row 12 c

就CPU周期而言,malloc()的成本是多少?(Vista/OS,最新版gcc,最高优化级别......)

基本上,我正在实现一个复杂的DAG结构(类似于链表),它由一些16B(不太常见)和20B节点(更常见)组成.

偶尔,我将删除一些节点,然后添加一些节点.但是,我可以简单地将不需要的节点移动到我的数据结构的末尾,然后在我的算法继续时更新字段,而不是总是使用malloc()和free().如果有空闲节点,我将更新字段; 如果没有,我将不得不分配一个新的.

问题是,我可能只有一个可用节点,而必须输入,例如,20个节点的数据.这意味着:

  • 我将检查可用的免费节点
  • 检查将成功,并且该免费节点将更新
  • 我将多次检查可用节点19
  • 所有检查都将失败,并且每次都会调用malloc()

问题:真的值得吗?我应该像往常一样使用malloc()和free(),还是值得在列表末尾保留一些空闲节点,并且即使它通常会失败并继续检查malloc()也值得检查?

更具体地说,

malloc()的CPU成本是多少?

Rik*_*ood 19

它的成本是否重要?真?

真正的答案是"它取决于".

这取决于事物的负荷

  • 操作系统当时还在做什么
  • 内存如何碎片化
  • 客户端PC上的内存和处理器的速度
  • 等等

如果此代码对性能非常重要,那么它们会为您提供所有可能的时间,并为您的使用案例制定出最佳模式.

如果它不是代码中性能最重要的部分,那么只需执行最清晰,最简单的实现和维护.

"我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源",Donald Knuth

  • 哦,是的,确实.堆碎片是应用程序中复杂的,不断变化的数据结构的主要性能之一 - 这也意味着要求单个分配的成本是错误的问题.---虽然我很佩服Knuth,但我相信他36岁的报价在这里被滥用了. (4认同)
  • @Iain:有根据的猜测可以在编写任何代码之前修复您的设计。Knuth 写那篇文章的时候,内存访问时间是恒定的,并且可以跟上 CPU,执行时间可以通过将指令表中的“周期”列相加来确定,并行执行是管理员的选择,而不是规范。您通常在多少台机器上进行测量?如果我的 CPU 的缓存大小是你的一半,我会在你的数据集的一半、四分之一或八分之一处遇到减速吗?堆*是*一个即将发生的可扩展性问题——而不是是否、何时。 (2认同)

Ama*_*9MF 5

malloc()函数没有,因为许多可能的状态内存管理器必须处理,以满足您的要求的延迟方面固定成本.

由于您的节点尺寸都比较小,你应该考虑总是在做一个分配一些较大规模的,也许每个分配10种或更多的节点尺寸和馅多余的人进入你的未使用的池.这样你就会不那么频繁地产生不确定的分配.但更重要的是,您将减少由如此多的微小分配造成的内存碎片量.

顺便说一下,因为你是不是在找借口,没有充分的理由来注入钝角设计特点,我不认为这种设计考虑"过早优化".可以增长到任意大小并持续任意持续时间的数据结构确实需要一些预先考虑.

尤其是,由于数据结构往往被其他开发者找到自己的方式进入计划外的用途后,往往,它罢工的清晰度和预期行为方面取得合理的平衡是非常重要的.

使用您自己的分配和释放函数来编写您的结构.单独实施.最初只使用malloc并释放单个节点以使调试更容易.之后,您可以根据需要使用更高级的算法重新设计它们.