AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stringvergleich mit Wildcards

Ein Thema von Willie1 · begonnen am 12. Dez 2008 · letzter Beitrag vom 11. Feb 2010
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.346 Beiträge
 
Delphi 12 Athens
 
#1

Re: Stringvergleich mit Wildcards

  Alt 23. Jun 2009, 15:24
Achtung: diese Veränderung bewirkt nur eine Verbesserung bei UnicodeStrings (PWideChar, WideString und UnicodeString)

Eigentlich hatte ich sowas zwar nicht vor, aber ich hab mich doch mal entschlossen die Unicodebehandlung aus meinem himXML zu extrahieren und hier mit einzubauen.

Es wird beim Unit-Start ein kleines Abbild des gesamten Unicode-2-Zeichensatzes angelegt und dann direkt darüber verglichen.

Nun wird also keine "LowerCase"-Kopie des Strings mehr benötigt, wenn nicht CaseSensitiv verglichen wird.
Und auch nicht mehr, wenn ein | im Suchmuster vorkommt.

Es gibt also vorallem bei langen Strings Vorteile, da nichts mehr rumkopiert werden muß.

Alleine nachfolgender Code ist damit gleich so etwa 3 mal schneller, als mit der alten Version:

Allerdings ist diese Version nicht zur Geschwindigkeitsoptimierung gedacht,
(im Durchschnitt mag sich dieses nur minimal ändern und vorallam nicht bei CaseSensitivem Vergleich)
sondern der Speicheroptimierung (kein unnötiges Rumhantieren im Speichermanager)

Außerdem gibt es noch ein paar zusätzliche Funktionen
* WideLowerCase > sollte klar sein
* WideSameText > das auch
* und eine abgewandelte Version von Hagen's ELF-Hash, welcher auf Unicode erweitert wurde und auch noch die Maskenzeichen beachtet

Delphi-Quellcode:
Var T: LongWord;

T := GetTickCount;
For i := 1 to 100000 do Begin
  MatchText('', 'abcdef');
  MatchText('abc', '');
  MatchText('abcdef', 'abcdef');
  MatchText('df', 'abcdef');
  MatchText('abc', 'abcdef');
  MatchText('def', 'abcdef');
  MatchText('abc?f', 'abcdef');
  MatchText('abc??f', 'abcdef');
  MatchText('abc*f', 'abcdef');
  MatchText('a?def', 'abcdef');
  MatchText('a??def', 'abcdef');
  MatchText('a*def', 'abcdef');
  MatchText('abcd?', 'abcdef');
  MatchText('abcd??', 'abcdef');
  MatchText('abcd???', 'abcdef');
  MatchText('abcd*', 'abcdef');
  MatchText('a?def', 'abcdef');
  MatchText('a??def', 'abcdef');
  MatchText('a*def', 'abcdef');
  MatchText('?cdef', 'abcdef');
  MatchText('??cdef', 'abcdef');
  MatchText('*cdef', 'abcdef');
  MatchText('b*c*f', 'abcdef');
  MatchText('a*c*f', 'abcdef');
  MatchText('a?c*f', 'abcdef');
  MatchText('a?d*f', 'abcdef');
  MatchText('*a*f*', 'abcdef');
  MatchText('*a?bf*', 'abcdef');
  MatchText('*c*f*', 'abcdef');
  MatchText('*c*d*', 'abcdef');
  MatchText('*c?f*', 'abcdef');
  MatchText('*d?f*', 'abcdef');
  MatchText('*', '');
  MatchText('*', 'abcdef');
  MatchText('a*', 'abcdef');
  MatchText('*f', 'abcdef');

  MatchText('ab\*ef', 'abcdef');
  MatchText('ab\*ef', 'ab*ef');
  MatchText('ab\*ef', 'abcef');

  MatchText('a*d|a*', 'abcdef');
  MatchText('a*d|a*', 'abcdef');
  MatchText('a*d|z*', 'abcdef');
End;
T := GetTickCount - T;
ShowMessage(IntToStr(T));
und wo ich den Code einzeln hab, kann ich nun auch mal in Ruhe (einfacher) schauen, ob mit der LowerCase-Behandlung auch alles richtig läuft ... mal sehn ob auch alles wirklich stimmt
Angehängte Dateien
Dateityp: pas matchtextunit_153.pas (88,7 KB, 125x aufgerufen)
Dateityp: exe project1_143.exe (565,5 KB, 17x aufgerufen)
Dateityp: exe project1_202.exe (558,0 KB, 21x aufgerufen)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


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 11:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz