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