在c++中用^=來交換會比swap快嗎?
很多人都覺得^=比較快,好吧,可惜事實並非如此。
以下是我的測試程式碼,timer是從3d繪圖程式設計那本書抓來的
#include "GutTimer.h"
#include <iostream>
void reverse1( char str[] )
{
int len = strlen( str );
for( int i = 0; i < len / 2; ++i )
{
if( str[i] == str[len-i-1] )
continue;
str[i] ^= str[len-i-1];
str[len-i-1] ^= str[i];
str[i] ^= str[len-i-1];
}
}
void reverse2(char str[])
{
int temp, len = strlen( str );
for( int i = 0; i < len / 2; ++i )
{
if( str[i] == str[len-i-1] )
continue;
temp = str[i];
str[i] = str[len-i-1];
str[len-i-1] = temp;
}
}
int main()
{
GutTimer timer;
char str[] = "abcdefg";
timer.Restart();
for (int i=0;i<1000000;i++)
{
reverse1(str);
}
std::cout << timer.GetTime() << std::endl;
timer.Restart();
for (int i=0;i<1000000;i++)
{
reverse2(str);
}
std::cout << timer.GetTime() << std::endl;
}
結果
reverse1 花 0.00778067s
reverse2 花 0.00623236s
原因詳見:
str[i] ^= str[len-i-1];
00FF157D mov eax,dword ptr [len]
00FF1580 sub eax,dword ptr [i]
00FF1583 mov ecx,dword ptr [str]
00FF1586 movsx edx,byte ptr [ecx+eax-1]
00FF158B mov eax,dword ptr [str]
00FF158E add eax,dword ptr [i]
00FF1591 movsx ecx,byte ptr [eax]
00FF1594 xor ecx,edx
00FF1596 mov edx,dword ptr [str]
00FF1599 add edx,dword ptr [i]
00FF159C mov byte ptr [edx],cl
str[len-i-1] ^= str[i];
00FF159E mov eax,dword ptr [len]
00FF15A1 sub eax,dword ptr [i]
00FF15A4 mov ecx,dword ptr [str]
00FF15A7 add ecx,dword ptr [i]
00FF15AA movsx edx,byte ptr [ecx]
00FF15AD mov ecx,dword ptr [str]
00FF15B0 movsx eax,byte ptr [ecx+eax-1]
00FF15B5 xor eax,edx
00FF15B7 mov ecx,dword ptr [len]
00FF15BA sub ecx,dword ptr [i]
00FF15BD mov edx,dword ptr [str]
00FF15C0 mov byte ptr [edx+ecx-1],al
str[i] ^= str[len-i-1];
00FF15C4 mov eax,dword ptr [len]
00FF15C7 sub eax,dword ptr [i]
00FF15CA mov ecx,dword ptr [str]
00FF15CD movsx edx,byte ptr [ecx+eax-1]
00FF15D2 mov eax,dword ptr [str]
00FF15D5 add eax,dword ptr [i]
00FF15D8 movsx ecx,byte ptr [eax]
00FF15DB xor ecx,edx
00FF15DD mov edx,dword ptr [str]
00FF15E0 add edx,dword ptr [i]
00FF15E3 mov byte ptr [edx],cl
00FF15E5 jmp reverse1+36h (0FF1546h)
temp = str[i];
00FF16A9 mov eax,dword ptr [str]
00FF16AC add eax,dword ptr [i]
00FF16AF movsx ecx,byte ptr [eax]
00FF16B2 mov dword ptr [temp],ecx
str[i] = str[len-i-1];
00FF16B5 mov eax,dword ptr [len]
00FF16B8 sub eax,dword ptr [i]
00FF16BB mov ecx,dword ptr [str]
00FF16BE add ecx,dword ptr [i]
00FF16C1 mov edx,dword ptr [str]
00FF16C4 mov al,byte ptr [edx+eax-1]
00FF16C8 mov byte ptr [ecx],al
str[len-i-1] = temp;
00FF16CA mov eax,dword ptr [len]
00FF16CD sub eax,dword ptr [i]
00FF16D0 mov ecx,dword ptr [str]
00FF16D3 mov dl,byte ptr [temp]
00FF16D6 mov byte ptr [ecx+eax-1],dl
00FF16DA jmp reverse2+36h (0FF1676h)
有人會問最佳化過後呢?
差別更大:
^= : 0.0232775s
tmp : 0.0125434s
留言列表