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.