• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

由于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人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap