剛看了一篇被推薦的文,感覺非常可笑,說自己的效能比系統的高
上面的代碼,竟然與API完全一樣
_htons@4:
71B628BC mov edi,edi ;只少了這兩個字節,我想這兩個字節的作用就不用作科普了吧
71B628BE push ebp
71B628BF mov ebp,esp
71B628C1 movzx eax,word ptr [ebp+8]
71B628C5 xor ecx,ecx
71B628C7 mov ch,al
71B628C9 shr eax,8
71B628CC or ecx,eax
71B628CE mov ax,cx
71B628D1 pop ebp
71B628D2 ret 4
這樣的代碼有何高低?
那如何提高性能呢
mov ecx,[esp+4] ;7
mov ah,cl ;2
mov al,ch ;2
retn 4 ;3
代碼長度 14,至於爲什麼不清高位,那看你怎麼寫函數描述.爲什麼不保護寄存器,因爲沒用到
可以再優化
mov eax,[esp+4] ;7
bswap ax ;3
retn 4 ;3
長度 14
再優化就不是__stdcall了,我們看看如何終極優化
_declspec(naked) short __fastcall Ntohs(short s)
{
__asm
{
bswap cx;3
mov eax,ecx ;2 爲什麼用eax,那是因爲可以省一個字節
ret ;1
}
}
長度 6
再短
_declspec(naked) short __fastcall Ntohs(short s)
{
__asm
{
mov ah,cl
mov al,ch
ret
}
}
長度5
總結一下效率,最後兩項比API提高 30% 以上,200W次的測試結果
至於 htonl 那也只要5字節
_declspec(naked) long __fastcall Ntohl(long s)
{
__asm
{
bswap ecx;2
mov eax,ecx ;2 /
ret ;1
}
}
而且速度與htons是一樣的
特別說明,統計代碼長度只是爲了減肥與速度無關