gpt4 book ai didi

c++ for loop efficiency : body vs.事后思考

转载 作者:行者123 更新时间:2023-11-30 01:43:04 24 4
gpt4 key购买 nike

我在 leetcode 上发现了一些有趣的东西,希望有人能帮助解释原因:

我基本上是在做归并排序,并使用快慢指针来找到中间指针。以下是此类代码片段的两个版本:

<强>1。事后更新

    for (ListNode* fast=head; 
fast->next && fast->next->next;
fast = fast->next->next, slow = slow->next) { }

<强>2。正文更新

    for (ListNode* fast=head; fast->next && fast->next->next; ) {
fast = fast->next->next;
slow = slow->next;
}

为什么版本 2 比第一个版本快?

编译器:g++ 4.9.2

最佳答案

逗号操作不太可能显着降低 for 循环的速度。

我制作了两个变体并打开了反汇编(在 Visual Studio 2012 中)让他们看到不同之处。

  1. 看起来像:

        for (ListNode* fast = head;
    0022545E mov eax,dword ptr [head]
    00225461 mov dword ptr [ebp-2Ch],eax
    fast->next && fast->next->next;
    00225464 jmp main+17Bh (022547Bh)
    fast = fast->next->next, slow = slow->next) {
    00225466 mov eax,dword ptr [ebp-2Ch]
    00225469 mov ecx,dword ptr [eax+4]
    0022546C mov edx,dword ptr [ecx+4]
    0022546F mov dword ptr [ebp-2Ch],edx
    00225472 mov eax,dword ptr [slow]
    00225475 mov ecx,dword ptr [eax+4]
    00225478 mov dword ptr [slow],ecx
    0022547B mov eax,dword ptr [ebp-2Ch]
    0022547E cmp dword ptr [eax+4],0
    00225482 je main+192h (0225492h)
    00225484 mov eax,dword ptr [ebp-2Ch]
    00225487 mov ecx,dword ptr [eax+4]
    0022548A cmp dword ptr [ecx+4],0
    0022548E je main+192h (0225492h)
    }
  2. 是:

        for (ListNode* fast = head; fast->next && fast->next->next;) {
    0024545E mov eax,dword ptr [head]
    00245461 mov dword ptr [ebp-2Ch],eax
    00245464 mov eax,dword ptr [ebp-2Ch]
    00245467 cmp dword ptr [eax+4],0
    0024546B je main+190h (0245490h)
    0024546D mov eax,dword ptr [ebp-2Ch]
    00245470 mov ecx,dword ptr [eax+4]
    00245473 cmp dword ptr [ecx+4],0
    00245477 je main+190h (0245490h)
    fast = fast->next->next;
    00245479 mov eax,dword ptr [ebp-2Ch]
    0024547C mov ecx,dword ptr [eax+4]
    0024547F mov edx,dword ptr [ecx+4]
    00245482 mov dword ptr [ebp-2Ch],edx
    slow = slow->next;
    00245485 mov eax,dword ptr [slow]
    00245488 mov ecx,dword ptr [eax+4]
    0024548B mov dword ptr [slow],ecx
    }

只有一个jmp是区别。抱歉,但我看不出有什么显着差异,所以也许性能问题不在这两个语句的位置。

关于c++ for loop efficiency : body vs.事后思考,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38429256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com