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

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值