Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
Delphi 12 Athens
|
AW: Alternative zu PosEx
29. Nov 2024, 12:50
Das anfängliche "SetLength()" bewirkt weniger als erwartet, dafür bingt "inline" deutlich mehr Zeitersparnis:
Delphi-Quellcode:
function MyStrPosEx(const SearchFor, SearchIn: string; Estimated: Integer = 0): TIntegerDynArray;
function Search(const SearchFor, SearchIn: string; var Index: Integer): Boolean; inline;
begin
Index := Pos(SearchFor, SearchIn, Index + 1);
Result := (Index > 0);
end;
begin
SetLength(Result, Estimated);
var Count: Integer := 0;
var Index: Integer := 0;
while Search(SearchFor, SearchIn, Index) do
begin
Inc(Count);
{Array vergrößern braucht viel Zeit, deshalb gleich etwas mehr Platz reservieren}
if Estimated < Count then
begin
Estimated := Count * 2;
SetLength(Result, Estimated);
end;
Result[Count - 1] := Index;
end;
SetLength(Result, Count);
end;
Code:
StrPosEx('7', sRandomString, Positions)
0:00:00.102
Result := MyStrPosEx('7', sRandomString, 0)
0:00:00.168
Result := MyStrPosEx('7', sRandomString, 10000000)
0:00:00.157
|
|
Zitat
|