簡體   English   中英

C ++的循環效率:主體與事后思考

[英]c++ for loop efficiency: body vs. afterthought

我在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就是區別。 抱歉,但是我看不到明顯的差異,因此也許性能問題不在那兩個語句的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM