[PL] (SegFault) Nie ma nic prostszego niż napisanie wolnego regexpa
Slajdy z prezentacji podczas SegFault Łódź 2018.
W prezentacji: o tym, jak działają silniki regexpów, jak to wpływa na czas działania regexpa. Oraz o tym, co złego może się stać, jeśli nie dbamy o wydajność regexpów.
NIE MA NIC PROSTSZEGO NIŻ NIE MA NIC PROSTSZEGO NIŻ NAPISANIE WOLNEGO NAPISANIE WOLNEGO REGEXPA REGEXPA MACIEK RZĄSA MACIEK RZĄSA SegFault Łódź, 18.05.2018 @mjrzasa
I'm definitely guilty of this. When I throw a regex together, I never worry about performance; I know the target strings will generally be far too small to ever cause a problem. Jeff Atwood, 2006
TEORIA... TEORIA... gramatyka regularna wyrażenie regularne: abab|abbb automat skończony a b a a b b b b źródło: A -> abB B -> bb B -> ab https://swtch.com/~rsc/regexp/regexp1.html
DWA RODZAJE SILNIKÓW DWA RODZAJE SILNIKÓW REGEXPÓW REGEXPÓW 1. Text-directed Thompson 1968, 400 linii w C grep, awk, sed, go oparte na DFA 2. Regex-directed Larry Wall, perl, 1987 Perl-Compatible Regular Expressions (JavaScript, Ruby, .Net,...) oparte na NFA
abab|abbb a b a a b b b b •abbb a b a a b b b b •abbb a b a a b b b b a•bbb a b a a b b b b ab•bb a b a a b b b b •abbb a b a a b b b b a•bbb a b a a b b b b ab•bb a b a a b b b b abb•b a b a a b b b b abbb• failure, backtracking
CO JUŻ WIEMY? CO JUŻ WIEMY? regexpy - osobny język programowania dwa rodzaje silników (maszyn wirtualnych) - text-directed, regex-directed istotna jest ilość kroków i powrotów
POWTÓRZENIA POWTÓRZENIA wydajność zależna od kontekstu zachłanne .* .+ - wydajność zależna od długości nadmiarowo znalezionego tekstu leniwe .*? .+? - wydajność zależna od długości szukanego tekstu testy pozytywne: szukany string w różnych miejscach tekstu testy negatywne: napis bardzo podobny do szukanego
CZEGO UNIKAĆ? CZEGO UNIKAĆ? nachodzące się zakresy /\d+\w*/ nachodzace się alternatywy /(\d+|\w+)/ odległe, krzyżujące się powtórzenia /.*-some text-.*;/ zagnieżdżone powtórzenia /(\d+)*\w/
KOMPUTERY TERAZ SĄ TAK KOMPUTERY TERAZ SĄ TAK SZYBKIE, ŻE NAWET 100 000 SZYBKIE, ŻE NAWET 100 000 KROKÓW NIE MA ZNACZENIA! KROKÓW NIE MA ZNACZENIA! kilka słów o zastosowaniach
ZLICZANIE LICZB W TEKŚCIE ZLICZANIE LICZB W TEKŚCIE co może być prostszego? # liczba # 1, 3243, 4323 pattern = /\d+/ # liczba z częścią dziesiętną i minusem # -1, 1, 32.32, -2.2324 pattern = /-?(\d+(\.\d+)?/ # liczba z częścią dziesiętną (kropka albo przecinek) # -23,23 4323.23 pattern = /-?(\d+([.,]\d+)?)/
TESTY TESTY greedy = /(-?(\d+[,.]?)+)/ lazy = /(-?(\d+?[,.]?)+?)/ unrolled = /(-?\d+([,.]\d+)*)/ possessive = /(-?(\d++[,.]?)++)/ string = "..." # ~11000 chars def count_whole(string, regex) # count how many times regex is matched on a string end def count_split(string, regex) { # split string to words, # then check which word is a number end
JAK ZAJĄĆ 100% PROCESORA? JAK ZAJĄĆ 100% PROCESORA? Witaj! → ¡Hola! → Salut ! # Ruby # Źródła funkcji ::Typography.to_html_french # Wstaw cienką spację przed znaki interpunkcyjne text.gsub(/(\s|)+([!?;]+(\s|\z))/, ' \2\3') # Dane # GET /wp-login.php HTTP/1.1 69 GET /show.aspx HTTP/1.1 15 klient Discourse, opisane przez Sama Saffrona
WNIOSKI WNIOSKI wyrażenia regularne - teoria (języki formalne) i praktyka (języki programowania) nie zawsze idą w parze każdy silnik jest inny - sprawdzaj, jak działa Twój główne problemy: nachodzące się zakresy lub alternatywy, zagnieżdżone powtórzenia testy: poprawny, niepoprawny, prawie poprawny napis, różne konfiguracje
POSTMODERNIZM(!) POSTMODERNIZM(!) (...) key parts of the Computer Science grand narrative are the twin goals of correctness and then efficiency (...) the aim of developing only “good enough software” — software that is neither correct nor efficient — but is good enough for its context of use, is also a postmodern approach. Noble, Biddle. Postmodern Prospects for Conceptual Modelling. 2006