也说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是一样的

 

特别说明,统计代码长度只是为了减肥与速度无关

 

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