![]() |
|
Модераторы: ginnie |
![]()
|
|
| zyxerr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 17.7.2008 Репутация: нет Всего: 2 |
$string = "Мама мыла раму";
1) /Мама/; 2) /^Мама/; 3) /^..../'; угадайте, какая регулярка работает быстрее? |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 1 Всего: 49 |
Судя по выводу быстрее должен быть первый вариант. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| zyxerr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 17.7.2008 Репутация: нет Всего: 2 |
у меня вышло: самый быстрый /Мама/ немного медленней /^..../ совсем медленный /^Мама/ (в два раза медленнй первого варианта) . и это странно, ведь "Мама" находится в начале строки и указание якоря по идее должно увеличивать скорость обработки, а оно наоборот - замедляет в два раза. Странно. Кстати, даже одна круглая скобка /(Мама)/ замедляет скорость в два раза. И указание модификатора /мама/i замедляет прилично. . если искать шаблоны 1) /Мама/ 2) /мыла/ 3) /раму/ быстрее всего ищется в начале строки (ну это вполне ожидаемо) Это сообщение отредактировал(а) zyxerr - 12.12.2008, 13:36 |
|||
|
||||
| zyxerr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 17.7.2008 Репутация: нет Всего: 2 |
вот такой еще тест (подобный пример часто Фридл приводит, говоря об оптимизации записи):
$string= "that cat is sad"; 1) /that|this|those/ 2) /th(at|is|ose)/ 3) /th(?:at|is|ose)/ какая регулярка быстрее? по Фридлу вариант 3 должен быть намного быстрее варианта 1, но он быстрее всего на 2-3% места распределились: /th(?:at|is|ose)/ - самый быстрый /that|this|those/ - уступает пару процентов (но при этом легче читается) /th(at|is|ose)/ - самый медленный (за счет сохранения переменной $1) . обнаружил интересную вещь: Strawbery Perl версии 5.10 МЕДЛЕННЕЕ В ТРИ РАЗА чем Active State Perl 5.8 (других версий у меня нет) Это сообщение отредактировал(а) zyxerr - 12.12.2008, 14:03 |
|||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: нет Всего: 50 |
Кстати, попробуйте померить скорость с модификатором /g |
|||
|
||||
| zyxerr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 17.7.2008 Репутация: нет Всего: 2 |
в первом тесте (Мама мыла раму) разница между Strawberry 5.10 и Active State 5.8 - почти в два раза в пользу последнего.
Добавлено @ 14:28 amg, тест с модификатором g:
второй вариант медленней на 40% (буква "а" встречается 12 раз в строке) третий вариант медленней на 80% Это сообщение отредактировал(а) zyxerr - 12.12.2008, 14:46 |
|||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: нет Всего: 50 |
||||
|
||||
| zyxerr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 17.7.2008 Репутация: нет Всего: 2 |
amg, мне кажется, это потому, что поиск БЕЗ /g идет слева направо, а с /g - справа налево.
здесь наоборот - второй вариант с /g медленней работает. Добавлено @ 15:04 если мы поставим "Раму" в середину: $string = "Мама мыла раму Раму раму мама мыла"; то все равно, модификатор /g замедляет поиск на 40%. . ИТОГ: поиск с модификатором /g начинается с конца строки. Если искомое слово стоит в конце, то добавление модификатора /g ускоряет поиск Это сообщение отредактировал(а) zyxerr - 12.12.2008, 15:06 |
|||
|
||||
| tolkien |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: нет Всего: 4 |
zyxerr
Лучше не зацикливаться на этом деле. Тем более ваши выше варианты не совсем корректны. Результат их работы в другом случаи(когда Мама будет в середине строки или в конце) будет совершенно разный. И не в плане производительности. Что есть существенное различие. Поэтому для корректной оценке нужно брать только такие регулярные выражения которые на всех входных данных будут давать одинаковый результат на выходе. Тогда и можно будет сравнивать производительность. В соседнем топике qcc хорошо написал насчет оптимизации. Что он сначала делает работоспособный код и уж потом если требуется его оптимизацию. |
|||
|
||||
| ginnie |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 1 Всего: 49 |
Уважаемый amg, не хочу Вас огорчать, но придется:
Добавлено через 2 минуты и 4 секунды
Perl так не умеет -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||||
|
|||||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: нет Всего: 50 |
||||
|
||||
| zyxerr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 17.7.2008 Репутация: нет Всего: 2 |
зы
Это сообщение отредактировал(а) zyxerr - 15.12.2008, 10:47 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Регулярные выражения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |