就CPU周期而言,malloc()的成本是多少? (Vista / OS,最新版本的gcc,最高优化级别,......)
基本上,我正在实现一个复杂的DAG结构(类似于链表) 由一些16B(不太常见)和20B节点(更常见)组成。
偶尔,我将删除一些节点,然后添加一些节点。 但是,我可以简单地移动,而不是总是使用malloc()和free() 不需要的节点到我的数据结构的末尾,然后更新 字段继续我的算法。如果有空闲节点,我会的 更新字段;如果没有,我将不得不分配一个新的。
问题是,我可能只有一个可用节点 例如,输入20个节点的数据。这意味着:
问题:这真的值得吗?我应该像往常一样只使用malloc()和free(), 或者是否值得在列表末尾保留一些免费节点, 并保持检查,即使它通常会失败并导致malloc()无论如何?
更具体地说,
malloc()的CPU成本是多少?
答案 0 :(得分:19)
它的成本是否重要?真的?
真正的答案是“它取决于”。
这取决于事物的负荷
如果此代码对性能非常重要,那么时间可以为您的用例提供最佳模式。
如果它不是最重要的性能代码,那么只需执行最清晰,最简单的实现和维护。
“我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源”,Donald Knuth
答案 1 :(得分:5)
malloc()在延迟方面没有固定的成本,因为内存管理器必须处理多种可能的状态来满足您的请求。
由于您的节点大小相对较小,您应该考虑始终分配一些更大的大小,每个分配可能有10个或更多节点大小,并将额外的大小填充到未使用的池中。这样你就会不那么频繁地产生不确定的分配。但更重要的是,您将减少由如此多的微小分配引起的内存碎片量。
顺便说一句,我不认为这种设计考虑因素是“过早优化”,因为你没有找借口在没有充分理由的情况下注入钝角设计特征。可以增长到任意大小并持续任意持续时间的数据结构确实需要一些预见。
特别是由于数据结构往往会在以后经常被其他开发人员用于计划外使用,因此在清晰度和预期行为方面取得合理的平衡非常重要。
使用您自己的分配和释放功能正确编写您的结构。单独实施。最初只使用malloc并释放单个节点以使调试更容易。之后,您可以根据需要使用更高级的算法重新设计它们。
答案 2 :(得分:4)
真的值得吗?
你必须衡量才能知道,期间。
答案 3 :(得分:2)
答案 4 :(得分:1)
除了@rikh强调的内容之外,如果你想要超快的内存分配,一种技术是预先分配你需要的大小的块(很多)。
我编写了自定义内存管理器,它们预先分配了不同大小的块列表。
此外,您还可以将内存边界检查方案合并到您正在管理的块中。
答案 5 :(得分:1)
您可能希望查看池化分配器;例如,AT& T的vmalloc
包提供了池化分配器。
答案 6 :(得分:1)
答案 7 :(得分:0)
值得了解目标操作系统中最小可分配块的含义。你可能会更好地使用4K块中的malloc()并将其用作未使用的池。
答案 8 :(得分:0)
答案 9 :(得分:-2)
上面的任何建议都促使你尝试某种特定的技巧是错误的。上面的建议告诉你要避免过早优化(确实是一个非常重要的原则),这是正确的。
你给了我们一个毫无意义的问题。什么CPU?什么速度?什么架构? Malloc是一个C函数。你在谈论标准堆例程的实现是什么? Microsoft Visual C / C ++中的那个? Linux / Unix / Posix上的GNU标准库(stdlibc)附带的那个?
您还没有测量过您的性能,然后告诉我们负载下的性能是什么,您没有告诉我们您为负载测试编写了单元测试。您是在进行初始设计还是同时“考虑多少次循环”?因为那太傻了。