Registriert seit: 17. Nov 2005
Ort: Hamburg
1.077 Beiträge
Delphi XE2 Professional
|
AW: Schnellstes Entfernen von Chars aus einem String?
31. Mär 2015, 01:07
Meine ist also nicht nur einfacher, sondern auch durchweg schneller. (CPU i7 4790K, 64 Bit)
Was sagst du nun?
Dazu sage ich, dass ich das nicht nachvollziehen kann.
Auf meinem Rechner (I7 2600K) sind die Ergebnisse so:
32 Bit Umgebung
Ergebnisse gleich
Min und Max CPU-Ticks für 1000 Durchläufe
T1 Min 141756 Max 358172
T2 Min 18144 Max 137786
64 Bit Umgebung
Ergebnisse gleich
Min und Max CPU-Ticks für 1000 Durchläufe
T1 Min 165112 Max 377076
T2 Min 19936 Max 146812
Ich habe die Test Prozedur noch etwas angepasst.
Beide Prozeduren laufen jeweils 1000 Mal und ich halte Min und Max CPU-Ticks fest.
Delphi-Quellcode:
So sieht die Test Prozedur jetzt aus:
PROCEDURE TMain.Test;
FUNCTION TimeStamp:Int64;
asm
rdtsc
{$IFDEF CPUX64}
shl rdx,32
or rax,rdx
{$ENDIF}
end;
FUNCTION NStr(V:Int64; Len:Integer): String;
begin
Str(V:Len,Result);
end;
const
S=' Zu Sets bzw. Array of Bool[Char] ist zu sagen, dass es wohl schon einen '+
' Sinn haben dürfte, weshalb Set auf 256 Elemente begrenzt ist. Mit jedem '+
' weiteren Element wächst auch der Speicherverbrauch. Bei WideChar belegt '+
' Array of Bool bereits 65 Kilobyte. Würde man statt Bools einzelne Bits '+
' verwenden wie bei Set , sind es immer noch 8 Kilobyte. Das ist zu groß '+
' um komplett in den CPU-Cache geladen zu werden. Würde man sequenziell '+
' durch den Bereich durchlaufen, wäre das zwar kein Problem, aber Sets '+
' sind prinzipbedingt Random Access. Würde mich nicht wundern, wenn es '+
' schneller wäre, einfach in einer Schleife durch die zu löschenden '+
' Elemente zu gehen und immer zu vergleichen (wie in meinem Code), solange '+
' es eine überschaubare Anzahl Zeichen ist, die entfernt werden soll.';
R=' Namenloser';
Res: Array[Boolean] of String=(' Ergebnisse verschieden',' Ergebnisse gleich');
Count=1000;
var
T0,T1,T2,MinT1,MaxT1,MinT2,MaxT2:Int64; S1,S2,S3: String; I,Len:Integer;
begin
MinT1:=High(Int64);
MinT2:=High(Int64);
MaxT1:=0;
MaxT2:=0;
for I:=1 to Count do begin
T0:=TimeStamp;
S1:=RemoveCharsFromString(S,R);
T1:=TimeStamp;
S2:=RemoveChars(S,R);
T2:=TimeStamp;
Dec(T2,T1);
Dec(T1,T0);
MinT1:=Min(MinT1,T1);
MaxT1:=Max(MaxT1,T1);
MinT2:=Min(MinT2,T2);
MaxT2:=Max(MaxT2,T2);
end;
Len:=Trunc(Log10(Max(MaxT1,MaxT2)))+2;
S3:= {$IFDEF CPUX64}' 64' {$ELSE}' 32' {$ENDIF}+' Bit Umgebung'+#13#10+
Res[S1=S2]+#13#10+
' Min und Max CPU-Ticks für '+IntToStr(Count)+' Durchläufe'+#13#10+
' T1 Min '+NStr(MinT1,Len)+' Max '+NStr(MaxT1,Len)+#13#10+
' T2 Min '+NStr(MinT2,Len)+' Max '+NStr(MaxT2,Len);
Clipboard.AsText:=S3;
ShowMessage(S3);
end;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
|