linux-ka
Hi,
es kommt doch öfter vor als gedacht, dass man in einem String nach Buchstabenkombinationen oder Begriffen sucht. Ich zb suche nach 3-10 Schlagworten.
Rein aus Neugier und Lernzweck; was ist denn in dieser Hinsicht performanter: regex oder die Memberfunktion find/find_first_of etc von std::string ?
Grüße,
L-K
Kinch
Da die Implementierung nicht spezifiziert ist, kann man die Frage eigentlich nicht beantworten. Im Zweifel vermutlich 'find', aber du wirst es wohl benchmarken müssen.
T.M.
Also regex ist wahrscheinlich immer langsamer. Es hängt von der Kompliziertheit (vor allem von der Länge) des Ausdrucks ab, aber selbst wenn der Ausdruck keine Metazeichen enthält, sondern eine einfache Konstante ist, meinetwegen "abc", dann dauert die Suche als regulärer Ausdruck dennoch länger als die üblichen find-Operationen. Zudem ist der Overhead bedeutend grösser, denn der reguläre Ausdruck muss vorher compiliert und im Speicher gehalten werden, was heute durch die regex-Klasse automatisiert wird.
Man muss sich betreffs der Performance vor Augen halten, dass das case sensitive Suchen oder Vergleichen einer Zeichenkette u.U. direkt vom Prozessor abgebildet werden kann, durch einen Maschinenbefehl, Funktionen wie strstr() sind deshalb überraschend kurz, während der Code zum Suchen eines regulären Ausdrucks eine äusserst komplizierte, etliche Bildschirmseiten lange Funktion ist. Dazwischen steht noch das case insensitive Suchen und Vergleichen. Wer intensiv mit Zeichenketten arbeitet, muss sich um solche Dinge Gedanken machen. Das falsche Verfahren kann durchaus spürbare Auswirkungen haben.
Man kann, wenn man auf reguläre Ausdrücke nicht verzichten kann, zumindest versuchen, das zeitaufwendige Compilieren zu minimieren, d.h. die Instanzen der regex-Klasse als static const zu vereinbaren. Dann werden diese nur ein einziges Mal compiliert. Fatal ist es, regex-Objekte lokal auf dem Stack anzulegen, womöglich noch in Schleifen, so dass sie jedesmal neu compiliert, einmal benutzt und anschliessend fortgeworfen werden. Im GNU-regex-Paket war die Compilierfunktion mal über 3000 Zeilen C-Code lang ... Man kann ferner darauf achten, dass reguläre Ausdrücke von ihrer Fomulierung her günstig zustandekommen, es gibt langsame und schnelle Mittel, und womöglich ist es auch schneller, nach zwei kurzen Ausdrücken zu suchen als nach einem langen. Da kann man sehr viel dran optimieren, wenn es wirklich sein muss.
linux-ka
Hm, alles klar. Dann werde ich mich erst einmal wieder an die string Funktionen halten. Für die paar Begriffe, die ich suche, ist wohl regex dann doch etwas zu schwergewichtig.
Danke für euer feedback :-)
L-K