0xDEADBEEF

[RSS]
««« »»»

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

5. 12. 2017

Jak je na tom výkon regulárních výrazů ve srovnání s ručně psanými parsery?

Otestoval jsem to na parsování logů webserveru.

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

Kód ručně napsaného parseru má 55 řádků a zabral mi přibližně stejně dlouho jako odladění regexu. Obě varianty vyprodukují identické výsledky.

Jako vstupní data jsem použil vzorek 1680000 řádků logu k47.cz. Regex je zpracuje za 9.26 vteřiny. Ruční variantě to trvá 1.3 vteřiny a z toho asi 0.3 vteřiny zabere jen alokace pod-řetězců.

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

píše k47 (@kaja47, k47)