Portál AbcLinuxu, 5. listopadu 2025 05:28
Regulární výrazy jsem vždycky považoval za cosi "nečistého", co sice zjednoduší život (viz Perl), ale výkonově pomalé - prosté srovnávání řetězců by mělo být (intuitivně) rychlejší.
V oblíbeném skriptu mám hromadu (cca 150) regulárních výrazů. Jediným úkolem skriptu je uhodnout, ke kterému výrazu zadaný řetězec odpovídá a podle toho provést akci.
Protože jsem měl pocit, že v tomto místě může být úzké hrdlo aplikace, přemýšlel jsem, že bych regulární výrazy rozdělil do skupin (podle začátku) a matchoval na dvakrát - pokud bude sedět začátek, vlezu do patřičné skupiny a matchuju podruhé. Zrychlení sice konstatní, ale je rozdíl, jestli se v nejhorším případě matchuje 150 výrazů nebo nebo jenom 10.
Ejhle - matchování cca 150 výrazů (po předkompilování) trvá průměrně 0.00017s, zkompilování 0.057s (jenže to se dělá jenom jednou, takže to můžeme v klidu ignorovat).
Z toho plyne, zatím nemá smysl optimalizovat. QED.
Tiskni
Sdílej:
Někteří autoři knihoven regexpů jdou tak daleko, že využívají vestavěného kompilátoru jazyka a kompilují stavový automat definovaný regulárním výrazem rovnou do nativního kódu. Výsledky jsou znát:
http://www.weitz.de/cl-ppcre/#performance
.match() nad objektem téměř celé proběhne v C.
Ale na první pohled to tak nevypadá.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.