刚看了一篇被推荐的文,感觉非常可笑,说自己的效能比系统的高
上面的代码,竟然与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是一样的
特别说明,统计代码长度只是为了减肥与速度无关