Xpoint
   [напомнить пароль]

В чем разница между регекспами?

Метки: [без меток]
[удл]
2005-12-07 15:05:23 [обр] Сергей Пантелеев(3/15)[досье]

Встретилось мне давеча регулярное выражение (не спрашивайте что оно делает - выдрано из куска чужого кода и вне этого куска ценности особой не представляет имхо). И задумался я, что будет если его немного "причесать". К счастью, задумался два раза.

# 1 - исходный вариант
timethis(150000, sub { foreach (@a) { /^<\!|<\/?script|<\/?%/i; } });

# 2 - причесанный вариант
timethis(150000, sub { foreach (@a) { /^<(?:\!|\/?script|\/?%)/i; } });

# 3 - причесанный вариант №2 (отличается от исходного наличием скобок)
timethis(150000, sub { foreach (@a) { /^(?:<\!|<\/?script|<\/?%)/i; } });

Результат меня несколько удивил.

timethis 150000: 45 wallclock secs (44.31 usr +  0.00 sys = 44.31 CPU) @ 3385.09/s (n=150000)
timethis 150000:  2 wallclock secs ( 1.31 usr +  0.00 sys =  1.31 CPU) @ 114329.27/s (n=150000)
timethis 150000:  2 wallclock secs ( 1.53 usr +  0.00 sys =  1.53 CPU) @ 97975.18/s (n=150000)

Разницу почему (2) быстрее (1), понять можно (хотя я успел удивиться, почему настолько быстрее). Но объяснить, почему (3) работает быстрее (1), я не способен. Кто-нить может подсказать/дать конкретную ссылку, почему так получилось? Спасибо.

спустя 7 минут [обр] Lynn «Кофеман»(0/571)[досье]
Потому что в первом варианте только первая из трёх альтернатив привязана к началу строки. Остальные ищутся по всему тексту.
спустя 3 минуты [обр] Сергей Пантелеев(3/15)[досье]
Спасибо, понял! Я уж думал что у меня крыша поехала... :)
Powered by POEM™ Engine Copyright © 2002-2005