在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

讓地獄深紅的天亮 發表在 痞客邦 PIXNET 留言(0) 人氣()