Einzelnen Beitrag anzeigen

Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.062 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Mehere Elemente eines Feldes löschen durch überschreiben

  Alt 22. Nov 2007, 03:57
@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;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat