zoukankan      html  css  js  c++  java
  • (转)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.
  • 相关阅读:
    页面打印
    scala
    IntelliJ Idea 常用快捷键列表
    flume
    spring事务管理方式,aop
    oldboy es和logstash
    elasticsearch视频34季
    elasticsearch视频
    python3
    git
  • 原文地址:https://www.cnblogs.com/jxgxy/p/1595720.html
Copyright © 2011-2022 走看看