Mam sobie taki skrypcik do sprawdzania niektórych aspektów standardów kodowania w pracy. Skrypcik ten zaczął ostatnio strasznie ścierwić, wziąłem się za sprawdzanie z czym jest problem. To co znalazłem nieco mnie zaskoczyło…
Po zapuszczeniu “ruskiego profilera” (robocza nazwa dla wyrzucania sobie w poszczególnych ciekawych miejscach aktualnych timestampów – skojarzenia z “ruskim debuggerem” są jak najbardziej na miejscu) na jednej z naszych aplikacji (charakteryzującej się tym, że jej kod źródłowy to około 1MB perla), okazało się że najwięcej ścierwią 2 testy:
- svnid - 10s
- vimaddon - 26s!!!
A to tylko proste regexpy:
- svnid ($comm w przypadku plików perla to ‘#’):
if (lc ($data) !~ /^\s*$comm+\s*\$id(?::|\$$)/m);
- vimaddon:
if ($data !~ /^\s*$comm+\s*vim:/m);
Trochę bez sensu, nie?
Okazało się że głównym winowajcą jest wspomniany w tytule modyfikator //m. Po zmianie tych regexpów na wersję bez //m obydwa testy zajmują poniżej sekundy. Przetestowanie całej aplikacji zaczęło się o: 1298146768.353036, a skończyło: 1298146769.3054, czyli wykonanie wszystkich testów zajęło mniej niż sekunda! Gdy wcześniej 2 testy zajmowały 36s.
Sposób naprawy? Zmieniłem te wyrażenia regularne na wersje:
-
svnid:
if (lc ($data) !~ /(?:^|\n)\s*$comm+\s*\$id(?::|\$)/);
-
vimaddon:
if ($data !~ /(?:^|\n)\s*$comm+\s*vim:/);