Einzelnen Beitrag anzeigen

Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#49

AW: Alternative zu PosEx

  Alt 3. Dez 2024, 12:49
Es gibt nur einige Gründe, die geloggt werden, wenn nicht geinlined wird, dieser hier ist keiner davon.
Inlining von Calls, die in einer Loop Bedingung stehen wurde erst jüngst (irgendwann in einer 10er?) implementiert.

Ich würde die Routine deshalb, damit man auch davor davon profitiert, umschreiben:

Delphi-Quellcode:
function MyStrPosEx(const SearchFor, SearchIn: string; Estimated: Integer = 0): TIntegerDynArray;
var
  Count, Index, SearchForLength: Integer;
begin
  SetLength(Result, Estimated);
  Count := 0;
  Index := 1;
  SearchForLength := Length(SearchFor);
  repeat
    Index := Pos(SearchFor, SearchIn, Index);
    if Index = 0 then Break;
    Inc(Count);
    if Estimated < Count then
    begin
      Estimated := Count * 2;
      SetLength(Result, Estimated);
    end;
    Result[Count - 1] := Index;
    Inc(Index, SearchForLength);
  until False;
  SetLength(Result, Count);
end;
Bei der Prüfung, ob die aktuelle Position noch innerhalb des zu durchsuchenden Teil des Strings ist vergleicht "PosEx" mit einem Wert, der auf dem Stack liegt, bei meiner "StrPosEx" mit einem Register, was deutlich schneller ist.
Bevor du solche Behauptungen aufstellst, solltest du nochmal die genauen Timings der entsprechenden Instruktionen zurate ziehen.

Ich zumindest bin immer wieder erstaunt.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 3. Dez 2024 um 13:15 Uhr)
  Mit Zitat antworten Zitat