AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: Algorithmen Delphi AnsiCharPos - Einzelne Zeichen in einem String suchen

AnsiCharPos - Einzelne Zeichen in einem String suchen

Ein Thema von peschai · begonnen am 15. Okt 2008
Antwort Antwort
Benutzerbild von peschai
peschai

Registriert seit: 15. Feb 2004
Ort: Göppingen
268 Beiträge
 
Delphi XE5 Professional
 
#1

AnsiCharPos - Einzelne Zeichen in einem String suchen

  Alt 15. Okt 2008, 10:43
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]
Peter Schaible
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf