Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Algorithmen (https://www.delphipraxis.net/28-library-algorithmen/)
-   -   Delphi AnsiCharPos - Einzelne Zeichen in einem String suchen (https://www.delphipraxis.net/122388-ansicharpos-einzelne-zeichen-einem-string-suchen.html)

peschai 15. Okt 2008 10:43


AnsiCharPos - Einzelne Zeichen in einem String suchen
 
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]


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz