@LoCrux:
Ich würde KILL so aufbauen :
Delphi-Quellcode:
PROCEDURE xKill(kill:char; var StrArr:TCharArray);
var i,j:integer;
begin
j:=0;
for i:=0 to High(StrArr) do
if StrArr[i]<>kill then begin
StrArr[j]:=StrArr[i];
inc(j);
end;
SetLength(StrArr,j);
end;
Warum ?:
Weil bei deiner Version SetLength wiederholt aufgerufen wird, nämlich für jeden Char, der nicht gelöscht wird.
Bei XKill nur einmal!
Bei Length(StrArr) = 10 habe ich gemessen
Für deine Version 4584 CPU-Ticks
Für meine Version 548 CPU-Ticks
Die Vervendung von Byte statt Char bringt meines Erachtens nichts, denn Char und Byte werden identisch abgewickelt.
Und zum Nachprüfen die Prozedur, mit der ich das getestet habe.
Delphi-Quellcode:
PROCEDURE TMain.Test;
var ta:TCharArray; i,n:integer; t0,t1,t2:Int64; s1,s2:
string;
FUNCTION TimeStamp:Int64;
asm
rdtsc;
end;
begin
t1:=High(int64);
t2:=High(int64);
for n:=1
to 10
do begin
// Ticks für KILL messen
setlength(ta,10);
for i:=0
to 9
do ta[i]:=Chr(Ord('
a')+i);
t0:=TimeStamp;
ta:=Kill('
c',ta);
t0:=TimeStamp-t0;
if t0<t1
then t1:=t0;
s1:='
';
// Nur zur Kontrolle, ob die
for i:=0
to high(ta)
do s1:=s1+ta[i];
// Ergebnisse idenstisch sind
// Ticks für xKILL messen
setlength(ta,10);
for i:=0
to 9
do ta[i]:=Chr(Ord('
a')+i);
t0:=TimeStamp;
xKill('
c',ta);
t0:=TimeStamp-t0;
if t0<t2
then t2:=t0;
s2:='
';
// Nur zur Kontrolle, ob die
for i:=0
to high(ta)
do s2:=s2+ta[i];
// Ergebnisse idenstisch sind
end;
showmessage(s1+'
'+IntToStr(t1)+#13+s2+'
'+IntToStr(t2));
end;