Ich habe schnell folgendes Testprogramm geschrieben:
Delphi-Quellcode:
program Project2;
{$APPTYPE CONSOLE}
{$O-}
uses
Windows, SysUtils;
var I, start, time1, time2, time3: Cardinal;
str, str2: String;
begin
setlength(str, 100000);
Randomize;
for I:=1 to 100000 do str[I]:=Chr(65+Random(26));
start:=GetTickCount;
for I:=1 to 100000 do
begin
str2:=str;
str2:=copy(str2, 1, 10);
end;
time1:=GetTickCount-start;
start:=GetTickCount;
for I:=1 to 100000 do
begin
str2:=str;
delete(str2, 11, length(str2));
end;
time2:=GetTickCount-start;
start:=GetTickCount;
for I:=1 to 100000 do
begin
str2:=str;
setlength(str2, 10);
end;
time3:=GetTickCount-start;
writeln(inttostr(time1)+#13#10+inttostr(time2)+#13#10+inttostr(time3));
readln;
end.
Dabei zeigt sich sehr deutlich, dass Methode 1 (copy) und Methode 3 (setlength) extrem schnell sind, Methode 2 dagegen unmenschlich langsam.
Hier die genauen Ergebnisse (Mehrmals gemessen, dann Durchschnitt gebildet):
Methode 1 (copy): 111 ms
Methode 2 (delete): 21691 ms
Methode 3 (setlength): 40 ms
Die Messwerte gelten für jeweils 100000 mal die ersten 10 Zeichen eines 100000 Zeichen Strings extrahieren.
Man sieht, dass setlength am schnellsten ist.
EDIT: Wenn der String kleiner als 10 Zeichen ist, passiert etwas sehr seltsames.
Der String wird mit #0en aufgefüllt, nur die letzten 2 Zeichen sind dan noch #77 und #83, werden allerdings mit showmessage, das ich zum Testen verwendet habe nicht angezeigt, klar, da die erste #0 als Ende des Strings gewertet wird bei der Übergabe als PChar.