【问题标题】:Optimisation linked list优化链表
【发布时间】:2017-04-23 18:57:24
【问题描述】:

也许是愚蠢的问题 - 但是,什么会更快:

-每次一个项目消失时从链表中删除一个项目(无论该项目是什么)

-只是将记录标记为死并在 x 时间或条件后覆盖它。

我会不会通过避免所有删除和插入而不是仅仅覆盖来减少 CPU 时间。

【问题讨论】:

  • 听起来你需要额外的开销和分支来做你想做的事。我的直觉告诉我,这可能会慢一些。找出答案的一种方法是对其进行编码并对其进行分析。
  • 问题不是指令数量,而是碎片堆/页错误。
  • 使用向量 :D
  • 我们所说的删除数是多少?
  • 但我不希望列表中出现超过 50、100 个节点。 有了这么少的节点,我不会期望那么多非优化版本和优化版本之间的执行速度差异。

标签: c++ linked-list


【解决方案1】:

找出答案的唯一方法是使用分析器。

请记住,还有一些您没有在问题中指定的非常重要的因素。例如,如果您知道要删除哪个元素,即您已经准备好指向它的指针,或者您必须遍历链表才能找到它,这会产生很大的不同。在这种情况下,由于缓存,向量实际上可能比任何链表(取决于元素的数量)快几倍。

【讨论】:

  • 我知道要删除的项目,但我仍然需要遍历列表才能找到它。我现在正在阅读向量,但是我肯定会测试这两种方法。话虽如此,对于我将要使用的物品数量,我怀疑它会产生很大的不同,但这是我想知道的,以供将来参考。谢谢。
【解决方案2】:

覆盖会更快。如果删除涉及从堆中释放分配的内存,那么覆盖肯定会更快。内存分配相对较慢。另外,随着时间的推移,您的列表内存会变得碎片化,这可能会导致缓存未命中。即使释放返回到某种内存管理器的内存也会更慢,因为您有管理列表节点的开销。

【讨论】:

  • 是的,我认为这很明显,但也许我错过了一些东西。我想在遍历列表和删除它们之间需要权衡,但我的列表永远不会很大(最多 50、100 个项目)。谢谢!
  • 在 poonam 给出的两个选项中,覆盖会更快。但考虑到他们说他们会经常遍历列表,我很确定如果元素数量不是数百万,向量会更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
相关资源
最近更新 更多