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:/);