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

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

 

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.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值