2017-04-13 100 views
-2

我为链表结构分配了一个大缓冲区,所以节点在连续的内存块中。 当我试图重复的链接列表,两种方式会导致不同的性能如下:为什么p ++比p = p-> next更快

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

} 

另一种方式是:

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

在性能上一个很大的不同,第二种方式是远远第一种方式背后,为什么会发生这种情况

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

+1

没有足够的上下文。你在优化吗?你在索引什么结构?等 – ChrisCM

+0

修改了这个问题,这是我使用的真正的循环 – user3126461

+0

为什么你的代码每隔几秒就会改变一次?你真的测试过什么版本的性能?我非常肯定你的表现结果已经完成。您测试的代码不是您发布的代码。第一个版本应该快一点,但它不应该有很大的差异。 – AnT

回答

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倍 等,等

因为链接列表不能直接访问其元素,所以每次通过索引访问元素时,都必须通过每个指针进行爬网才能访问该元素。

+0

问题的第一个循环似乎预先对'first'进行随机访问。 OP还暗示“第一”是可以增加的。容器不可能是一个列表。 –

+1

很难说出OP的意图,没有足够的细节,这是我最好的猜测,因为那里的信息。 – ChrisCM

+0

假设OP使用列表,你认为'first'是什么,'first [index]'是如何工作的? –