也說htons

剛看了一篇被推薦的文,感覺非常可笑,說自己的效能比系統的高

 

上面的代碼,竟然與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是一樣的

 

特別說明,統計代碼長度只是爲了減肥與速度無關

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章