Most performant way to subtract one array from another

后端 未结 5 953
别跟我提以往
别跟我提以往 2021-02-08 23:32

I have the following code which is the bottleneck in one part of my application. All I do is subtract on Array from another. Both of these arrays have more around 100000 element

5条回答
  •  灰色年华
    2021-02-08 23:53

    I'm not assembly expert but I think the following are near optimal if you don't take into account SIMD instructions or parallel processing, the later can be easily accomplished by passing portions of the array to the function.

    like
    Thread1: SubArray(ar1[0], ar2[0], 50);
    Thread2: SubArray(ar1[50], ar2[50], 50);

    procedure SubArray(var Array1, Array2; const Length: Integer);
    var
      ap1, ap2 : PInteger;
      i : Integer;
    begin
      ap1 := @Array1;
      ap2 := @Array2;
      i := Length;
      while i > 0 do
      begin
        ap1^ := ap1^ - ap2^;
        Inc(ap1);
        Inc(ap2);
        Dec(i);
      end;
    end;
    
    // similar assembly version
    procedure SubArrayEx(var Array1, Array2; const Length: Integer);
    asm
      // eax = @Array1
      // edx = @Array2
      // ecx = Length
      // esi = temp register for array2^
      push esi
      cmp ecx, 0
      jle @Exit
      @Loop:
      mov esi, [edx]
      sub [eax], esi
      add eax, 4
      add edx, 4
      dec ecx
      jnz @Loop
      @Exit:
      pop esi
    end;
    
    
    procedure Test();
    var
      a1, a2 : array of Integer;
      i : Integer;
    begin
      SetLength(a1, 3);
      a1[0] := 3;
      a1[1] := 1;
      a1[2] := 2;
      SetLength(a2, 3);
      a2[0] := 4;
      a2[1] := 21;
      a2[2] := 2;
      SubArray(a1[0], a2[0], Length(a1));
    
      for i := 0 to Length(a1) - 1 do
        Writeln(a1[i]);
    
      Readln;
    end;
    

提交回复
热议问题