注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

鑫淼梦园的博客

圆你的梦想 从这里开始

 
 
 

日志

 
 

DELPHI大内存清零快速算法(Delphi MMX优化算法应用之二)  

2013-01-13 15:08:29|  分类: delphi xe3 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 DELPHI大内存清零快速算法(Delphi MMX优化算法应用之二)

由于DELPHI里面动态数组的初始值并不是时时为0,对于一维数组每次使用前先SetLength后然一般做法都是使用FillChar来清零,但如果是超过几十M的数组如果FillChar来清零效率就很底,为此我专门写了一些清空数组或者内存的优化代码.

[csharp] view plaincopy
1.使用MMX指令优化的清零内存代码:  
procedure ZeroMemoryMMX(Destination: Pointer; aSize: DWORD);  
//EDX,ECX,ESI,EDI,EBP  
asm  
  pushad  
  MOV EDI,Destination  
  MOV ECX, aSize  
  shr ecx, 3  
  lea edi, [edi+ecx*8]  
  neg ecx  
  PXOR MM0,MM0  
  PXOR MM1,MM1  
  PXOR MM2,MM2  
  PXOR MM3,MM3  
  PXOR MM4,MM4  
  PXOR MM5,MM5  
  PXOR MM6,MM6  
  PXOR MM7,MM7  
@writeloop:  
  movntq qword [edi+ecx*8], mm0  
  movntq qword [edi+ecx*8+8], mm1  
  movntq qword [edi+ecx*8+16], mm2  
  movntq qword [edi+ecx*8+24], mm3  
  movntq qword [edi+ecx*8+32], mm4  
  movntq qword [edi+ecx*8+40], mm5  
  movntq qword [edi+ecx*8+48], mm6  
  movntq qword [edi+ecx*8+56], mm7  
  add ecx, 8  
  mov eax,ecx  
  neg eax  
  cmp eax,8  
  JLE @Comm  
  jnz @writeloop  
  jmp @end  
 @Comm:  
  
@end:  
  sfence  
  emms  
  popad  
end;  
  
2.使用rep指令优化的清零内存代码:  
procedure ZeroMemoryRep(Destination: Pointer; Length: DWORD); stdcall;  
asm  
  pushad  
  xor   eax, eax          //写入数据  
  mov   ecx, Length       //获得长度  
  mov   edi, Destination  //目标指针  
  rep stosb  
  popad  
end;  
以上两种代码经过测试发现50M上数据使用MMX效率要高于使用rep,50M下推荐使用Rep
  评论这张
 
阅读(453)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017