就CPU周期而言,malloc()的成本是多少?(Vista/OS,最新版gcc,最高优化级别......)
基本上,我正在实现一个复杂的DAG结构(类似于链表),它由一些16B(不太常见)和20B节点(更常见)组成.
偶尔,我将删除一些节点,然后添加一些节点.但是,我可以简单地将不需要的节点移动到我的数据结构的末尾,然后在我的算法继续时更新字段,而不是总是使用malloc()和free().如果有空闲节点,我将更新字段; 如果没有,我将不得不分配一个新的.
问题是,我可能只有一个可用节点,而必须输入,例如,20个节点的数据.这意味着:
问题:真的值得吗?我应该像往常一样使用malloc()和free(),还是值得在列表末尾保留一些空闲节点,并且即使它通常会失败并继续检查malloc()也值得检查?
更具体地说,
malloc()的CPU成本是多少?
Rik*_*ood 19
它的成本是否重要?真?
真正的答案是"它取决于".
这取决于事物的负荷
如果此代码对性能非常重要,那么它们会为您提供所有可能的时间,并为您的使用案例制定出最佳模式.
如果它不是代码中性能最重要的部分,那么只需执行最清晰,最简单的实现和维护.
"我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源",Donald Knuth
malloc()函数没有,因为许多可能的状态内存管理器必须处理,以满足您的要求的延迟方面固定成本.
由于您的节点尺寸都比较小,你应该考虑总是在做一个分配一些较大规模的,也许每个分配10种或更多的节点尺寸和馅多余的人进入你的未使用的池.这样你就会不那么频繁地产生不确定的分配.但更重要的是,您将减少由如此多的微小分配造成的内存碎片量.
顺便说一下,因为你是不是在找借口,没有充分的理由来注入钝角设计特点,我不认为这种设计考虑"过早优化".可以增长到任意大小并持续任意持续时间的数据结构确实需要一些预先考虑.
尤其是,由于数据结构往往被其他开发者找到自己的方式进入计划外的用途后,往往,它罢工的清晰度和预期行为方面取得合理的平衡是非常重要的.
使用您自己的分配和释放函数来编写您的结构.单独实施.最初只使用malloc并释放单个节点以使调试更容易.之后,您可以根据需要使用更高级的算法重新设计它们.