Analiza kodu źródłowego silnika PHP

1

Znalazłem implementacje pewnej funkcji z PHP w jego silniku. Umiem trochę C, ale nie na tyle żeby poprawnie zanalizować ten kod: : https://github.com/php/php-src/blob/master/ext/pcre/php_pcre.c#L1179

Tutaj ta funkcja przyjmuje wiele parametrów, jednymi z nich są offset_capture oraz unmatched_as_null. Tzn to są tak na prawdę zmienne, wyciągane z flagi flags po bitach PREG_OFFSET_CAPTURE oraz PREG_UNMATCHED_AS_NULL.

Próbuję się dowiedzieć, czy przekazanie tych flag PREG_UNMATCHED_AS_NULL oraz PREG_OFFSET_CAPTURE ma jakikolwiek wpływ na performance tej funkcji. Czy jest coś takiego że jak się je przekaże (lub nie) to funkcja wykonuje jakieś dodatkowe checki/calle/funkcje/zapewnienia etc.? Czy może jest tak że ich przekazanie wpływu na performance nie ma żadnego?

3

Z tego co widzę, to offset_capture jest sprawdzane dwa razy, a unmatched_as_null jest sprawdzane raz. Także tak, kod się branchuje w zależności od ustawionej flagi więc mają one wpływ na czasy wykonania i to nawet wtedy, gdy use_flags będzie false.

0
several napisał(a):

Z tego co widzę, to offset_capture jest sprawdzane dwa razy, a unmatched_as_null jest sprawdzane raz. Także tak, kod się branchuje w zależności od ustawionej flagi więc mają one wpływ na czasy wykonania i to nawet wtedy, gdy use_flags będzie false.

No tak, wiadomo że będzie się działo coś innego, tylko pytanie czy to jest zwykła logika, która wpływ na performance ma mały/żaden, czy jednak jest coś co "sieka"?

@several: A na Twoje oko, jak byś miał strzelać. Powiedziałbyś że jest jakaś różnica w performance'ie?

2

Ciężko powiedzieć, widać, że gdy masz włączone te flagi to dzieje się jakieś dodatkowe wywołanie add_offset_pair. Oczywiście jak to zwykle bywa: nie ma sensu gdybać. Albo zrobisz pomiary (https://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html) ale musisz skompilować PHPa z symbolami debuggerskimi i flagą -fno-omit-frame-pointer. Albo zbudujesz jakiś benchmark np. używając https://github.com/google/benchmark i porównując czasy wywołania w zależności od wybranej flagi

1

@several: A na Twoje oko, jak byś miał strzelać. Powiedziałbyś że jest jakaś różnica w performance'ie?

Trochę stawiasz mnie pod ścianą, ale to na prawdę Ciężko powiedzieć. add_offset_pair o której pisał @slsy w pewnych warunkach dokłada gdzieś dodatkową pamięć i robi hashowanie, jeśli ta ścieżka będzie często wywołana i mamy do czynienia ze sporą fragmentacją to może tu dojść do relatywnego zwolnienia. Jakbym miał strzelać na oko to powiedziałbym, że nic nie wskazuje tu na jakąś masakrę, ale nie wiem za wiele o implementacji regexów więc mogę być w strasznym błędzie.

0
several napisał(a):

@several: A na Twoje oko, jak byś miał strzelać. Powiedziałbyś że jest jakaś różnica w performance'ie?

Trochę stawiasz mnie pod ścianą, ale to na prawdę Ciężko powiedzieć. add_offset_pair o której pisał @slsy w pewnych warunkach dokłada gdzieś dodatkową pamięć i robi hashowanie, jeśli ta ścieżka będzie często wywołana i mamy do czynienia ze sporą fragmentacją to może tu dojść do relatywnego zwolnienia. Jakbym miał strzelać na oko to powiedziałbym, że nic nie wskazuje tu na jakąś masakrę, ale nie wiem za wiele o implementacji regexów więc mogę być w strasznym błędzie.

No dlatego właśnie chciałem poprosić kogoś obeznanego w C o małą analizę tej funkcji. Żeby rzucił więcej światła.

1 użytkowników online, w tym zalogowanych: 0, gości: 1