为什么p ++比p = p->接下来要快得多

时间:2017-04-13 19:43:24

标签: c++ optimization

我为链接列表结构分配了一个大缓冲区,因此节点位于连续的内存块中。 当我尝试迭代链接列表时,有两种方式会导致不同的性能,如下所示:

while(index<ListCount) {
    if (first[index++].key == key) { return;}

}

另一种方式是:

while(first) {
  if (first->key == key) { return; }
  first = first->next;
}

性能有很大不同,第二种方式远远落后于第一种方式,为什么会发生这种情况?

每个节点包含16个字节的变量,包括下一个指针。

1 个答案:

答案 0 :(得分:1)

您似乎对伪代码感到满意,所以我正在回答伪代码。

我发现你索引的结构很可能是一个“链接”列表。假设您在链表中有1,000个元素。当你说,

yourList[1000]

访问第1000个元素的唯一方法是执行此操作

counter = 1000;
while(counter-- > 0) { //Ignoring potential off by 1 errors, this is for demonstration purposes only
    node = node->next;
}

所以,如果在你的循环中,你的目标是通过访问你正在访问的索引元素来引用每个元素一次

元素1:1000次 元素2:999次 元素3:998次 元素4:997次 等等。

因为链接列表没有对其元素的直接访问权限,所以每次按索引访问元素时,它都必须遍历每个指针才能到达该元素。