[英]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中),以使它們看到差異。
看起來像:
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) }
是:
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.