0xDEADBEEF

[RSS]
««« »»»

Java, Scala a regulární výrazy #3 - rychlost

5. 12. 2017

Jak je na tom výkon re­gu­lár­ních výrazů ve srov­nání s ručně psa­nými par­sery?

Otes­to­val jsem to na par­so­vání logů web­ser­veru.

Re­gu­lární výraz vypadá takhle: ^(\S++) (\S++) (\S++) \[([^]]++)\] "((?:\\"|[^"])++)" (\d++) (\d++|-) "((?:\\"|[^"])*+)" "((?:\\"|[^"])*+)".*$

Kód ručně na­psa­ného par­seru má 55 řádků a zabral mi při­bližně stejně dlouho jako od­la­dění regexu. Obě va­ri­anty vy­pro­du­kují iden­tické vý­sledky.

Jako vstupní data jsem použil vzorek 1680000 řádků logu k47.cz. Regex je zpra­cuje za 9.26 vte­řiny. Ruční va­ri­antě to trvá 1.3 vte­řiny a z toho asi 0.3 vte­řiny zabere jen alo­kace pod-ře­tězců.

Ve vý­sledku je regex asi 7x po­ma­lejší než ručně psaný kód.

píše k47 (@kaja47, k47)