Zitat von
Meflin:
Ich hoffe es kommt auch noch was schnelles dabei raus
Klar geht es noch schneller. Nur wird es dann ziemlich lowlevelig und spezialisierter.
Delphi-Quellcode:
type
THackedStringList = class(TStrings) // funktioniert nur noch mit echten TStringList Klassen
public
FList: PStringItemList;
end;
function V2(s: TStringList): Integer;
var
l, i, j, n: Integer;
z: PChar;
x: String;
Arr: array of record
Data: PChar;
Len: Integer;
end;
begin
n := 0;
SetLength(Arr, s.Count);
for i := 0 To s.Count - 1 Do
begin
Arr[i].Data := Pointer(THackedStringList(s).FList[i].FString); // kein CPU LOCK mehr
Arr[i].Len := Length(PString(@Arr[i].Data)^);
Inc(n, Arr[i].Len);
end;
SetLength(x, n);
j := 0; // PChar startet bei 0
for i := 0 To High(Arr) do
begin
z := Arr[i].Data;
l := Arr[i].Len;
Move(z^, PChar(PChar(Pointer(x)) + j)^, l * SizeOf(Char)); // kein UniqueString aufrufen
Inc(j, l);
end;
Result := Length(x);
end;