Hallo Delphianer,
Vor kurzem konnte ich einen gewichtigen Performance Gewinn erzielen durch Einsatz von AnsiStrScan anstelle AnsiPos. Dies funktioniert, wenn nur nach einem Zeichen gesucht werden muss. Also habe ich mich auf die Suche nach einem AnsiCharPos in Delphi und im Internet gemacht und nichts gefunden ! ...
Habe das Ganze in eine Funktion gepackt mit dem Ziel kompatibel zu AnsiPos zu sein. Also identische Verwendung, aber bessere Performance, wenn nur nach einem Zeichen gesucht werden muss.
Delphi-Quellcode:
// AnsiCharPos für Delphi von Peter Schaible
// Schnelleres AnsiPos bei der Suche nach nur einem Zeichen!
// Aufruf- und Ergebniskompatibel zu AnsiPos mit gewollter Ausnahme des Char anstelle des Strings
// Sonderbehandlung von NIL,'' oder #0 wie bei AnsiPos ebenfalls berücksichtigt
function AnsiCharPos(aChar: Char; const S: string): Integer;
var
P: PChar;
begin
result := 0;
if (aChar=#0) then exit;
P := AnsiStrScan(PChar(S),aChar);
if (P<>nil) then
result := Integer(P)-Integer(PChar(S)) + 1;
end;
Bestehende Aufrufe lassen sich wie folgt ersetzen:
Delphi-Quellcode:
...
i1 := AnsiPos('=',sLine);
...
// ==>
...
i1 := AnsiCharPos('=',sLine)
...
Geprüft mit folgenden Aufrufen (liefern identische Ergebnisse zu AnsiPos):
Zitat:
AnsiCharPos('A','ABCDE')=1
AnsiCharPos('B','ABCDE')=2
AnsiCharPos('E','ABCDE')=5
AnsiCharPos('A','A')=1
AnsiCharPos('A','')=0
AnsiCharPos(#0,'')=0
AnsiCharPos(#0,#0)=0
AnsiCharPos(#0,#0#0)=0
AnsiCharPos(#0,'A'#0)=0
Delphi QualityCentral issue 67914
delphi10 hat den Code noch einem Performance-Test unterzogen:
Zitat:
Hab die Funktion mal getestet, indem ich Deinen Testblock etwa 13 Mill. mal mit AnsiCharPos und AnsiPos durchlaufen ließ. Ganz einfach mit der Stoppuhr jeweils die Zeit genommen, ergibt folgendes Bild:
1.AnsiCharPos = 3 sec.
2.AnsiPos = 16 sec.
[edit=fkerber]Beitrag aufbereitet. Mfg, fkerber[/edit]