![]() |
|
Модераторы: ginnie |
![]()
|
|
| zyxerr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 17.7.2008 Репутация: нет Всего: 2 |
Добрый день!
1) Как отключить стандартные оптимизации (описанные у Фридла, глава "стандартные оптимизации") в движке регулярных выражений? 2) Можно ли их выборочно отключать? 3) где в исходниках Perl они прописаны? |
|||
|
||||
| tolkien |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: нет Всего: 4 |
ОФФТОП
Может вам ненужно этого делать. Все же не зря люди их делали. Они помогают когда текст небольшой. Работает очень быстро. Отсюда простой вывод для оптимизации работы текста с рег выражениями. Нужно оптимизировать сам текст. Т.е разбивать на мелкие части и их обрабатывать рег выраж. |
|||
|
||||
| zyxerr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 17.7.2008 Репутация: нет Всего: 2 |
Добрый день, tolkien
. Я понимаю, что их не зря делали . попробую поискать на perlmonks Добавлено @ 11:52 "Т.е разбивать на мелкие части и их обрабатывать рег выраж. " . а можно поподробнее? т.е. если у меня строка вида: . "text text text text text text text text text text text text text text text text text text text " . и некоторый набор регулярных выражений, которыми нужно обработать эту строку, то нужно разбить строку на массив: text text text text text text text text text и каждый элемент массива обработать этими правилами? Разве это даст выигрыш по времени? или я не так понял Это сообщение отредактировал(а) zyxerr - 8.12.2008, 11:53 |
|||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: нет Всего: 50 |
zyxerr, нужно еще учитывать, перл и его машина регулярных выражений постоянно развиваются и всяческие неоптимальности в более новых версиях устраняются.
Приведу пример. Когда-то писали, что нежадный поиск -- это нехорошо, медленно. Так оно и было, помнится, сам проверял сколько то лет назад. А недавно еще раз проверил на perl 5.8.8 типичную задачу, поиск между тэгами в большой html. И с удивлением обнаружил, что среди вариантов m|<tag>(.*?)</tag>|; m|<tag>([^<]*)</tag>|; m|<tag>((?:.(?!</tag>))*.)</tag>|; первый из них (обыкновенный нежадный поиск) оказался быстрее всех. Думаю, что авторы перла Фридла тоже читали, и, возможно, уже все хорошо. Это сообщение отредактировал(а) amg - 8.12.2008, 12:53 |
|||
|
||||
| tolkien |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: нет Всего: 4 |
Даст потрясающий выигрыш в производительности. Потому что прежде чем обработать строку. Рег выражение ее сначала оптимизирует. Если взять например функцию index то ее производительность от длины текста в котором производиться поиск не меняется. А у рег выражений она катастрофически падает. Чем длинее текст тем сильнее падает. |
|||
|
||||
| zyxerr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 17.7.2008 Репутация: нет Всего: 2 |
Кстати, пишу вот:
. угадайте чему равно $c? - 999424 (!), странно, а почему не миллион? |
|||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: нет Всего: 50 |
Мысль об отключении буферирования -- верная, только отключать его нужно было не STDOUT'у, а OU1.
select OU1; $| = 1; # Побочный эффект -- print без указания файлхэндлера будет печатать в OU1 ... |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 1 Всего: 49 |
amg, может лучше
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: нет Всего: 50 |
ginnie, а чем лучше? (это не риторический вопрос, просто я никогда не пользовался autoflush и не знаю преимуществ)
|
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 1 Всего: 49 |
amg, лучше тем, что не меняется дескриптор вывода по-умолчанию.
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| zyxerr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 17.7.2008 Репутация: нет Всего: 2 |
amg, большое спасибо, не знал такой особенности насчет Select OU1
|
|||
|
||||
| tolkien |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: нет Всего: 4 |
Во первых. Зачем вам отключать буферизацию? Вы знаете что код с буферизацией значительно быстрее работает чем код с отключенной буферизацией? И в вашем коде есть грубейшая ошибка. В результате который вы получаете такой странный результат. В любой литературе по программированию в разделе работы с файлами. Написано ОБЯЗАТЕЛЬНО ЗАКРЫВАЙТЕ ОТКРЫТЫЕ ФАЙЛОВЫЕ МАНИПУЛЯТОРЫ КОГДА ОНИ ВАМ БОЛЬШЕ НЕ НУЖНЫ!!!
Вывод: 1000000 |
||||||
|
|||||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Регулярные выражения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |