Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

Re: Stringvergleich mit Wildcards

  Alt 23. Jun 2009, 16: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)
$2B or not $2B
  Mit Zitat antworten Zitat