在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
由于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. |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论