Модераторы: ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как отключить стандартные оптимизации, движка регулярных выражений? 
:(
    Опции темы
zyxerr
Дата 5.12.2008, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 17.7.2008

Репутация: нет
Всего: 2



Добрый день!
1) Как отключить стандартные оптимизации (описанные у Фридла, глава "стандартные оптимизации") в движке регулярных выражений? 
2) Можно ли их выборочно отключать?
3) где в исходниках Perl они прописаны?

PM MAIL   Вверх
tolkien
Дата 6.12.2008, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: нет
Всего: 4



ОФФТОП
Может вам ненужно этого делать. Все же не зря люди их делали. Они помогают когда текст небольшой. Работает очень быстро. Отсюда простой вывод для оптимизации работы  текста с рег выражениями. Нужно оптимизировать сам текст. Т.е разбивать на мелкие части и их обрабатывать рег выраж.
PM MAIL   Вверх
zyxerr
Дата 8.12.2008, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 17.7.2008

Репутация: нет
Всего: 2



Добрый день, tolkien
.
Я понимаю, что их не зря делали smile Но Фридл пишет, что многие оптимизации могут также и негативно влиять на скорость исполнения. Особенно это касается случаев, когда и сама запись шаблона подвергается ручной оптимизации.  Он называет эти случаи "чрезмерной оптимизацией" (с. 270)
.
попробую поискать на 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
PM MAIL   Вверх
amg
Дата 8.12.2008, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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
PM MAIL   Вверх
tolkien
Дата 8.12.2008, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: нет
Всего: 4



Цитата(zyxerr @ 8.12.2008,  11:48)
Добрый день, tolkien
...
то нужно разбить строку на массив:
text 
text 
text 
text 
text 
text 
text 
text 
text 
и каждый элемент массива обработать этими правилами? Разве это даст выигрыш по времени? или я не так понял

Даст потрясающий выигрыш в производительности. Потому что прежде чем обработать строку. Рег выражение ее сначала оптимизирует. Если взять например функцию index то ее производительность от длины текста в котором производиться поиск не меняется. А у рег выражений она катастрофически падает. Чем длинее текст тем сильнее падает. 

PM MAIL   Вверх
zyxerr
Дата 9.12.2008, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 17.7.2008

Репутация: нет
Всего: 2



Кстати, пишу вот:

Код

$| = 1;

open (OU1,">1.txt");
for (1 .. 1000000) {print OU1 "text\n"}

open(IN1, "1.txt");
while(<IN1>){$c++ if /text/}

print $c; <> 

.
угадайте чему равно $c?  -  999424 (!), странно, а почему не миллион?
PM MAIL   Вверх
amg
Дата 9.12.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: нет
Всего: 50



Мысль об отключении буферирования -- верная, только отключать его нужно было не STDOUT'у, а OU1.
select OU1;
$| = 1;
# Побочный эффект -- print без указания файлхэндлера будет печатать в OU1
...

PM MAIL   Вверх
ginnie
Дата 9.12.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 1
Всего: 49



amg, может лучше

Код

use IO::Handle;
autoflush OU1 1;




--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
amg
Дата 9.12.2008, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: нет
Всего: 50



ginnie, а чем лучше? (это не риторический вопрос, просто я никогда не пользовался autoflush и не знаю преимуществ)
PM MAIL   Вверх
ginnie
Дата 9.12.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 1
Всего: 49



amg, лучше тем, что не меняется дескриптор вывода по-умолчанию.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
zyxerr
Дата 9.12.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 17.7.2008

Репутация: нет
Всего: 2



amg, большое спасибо, не знал такой особенности насчет Select OU1

PM MAIL   Вверх
tolkien
Дата 9.12.2008, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: нет
Всего: 4



Цитата(zyxerr @ 9.12.2008,  11:52)
Кстати, пишу вот:

Код

$| = 1;

open (OU1,">1.txt");
for (1 .. 1000000) {print OU1 "text\n"}

open(IN1, "1.txt");
while(<IN1>){$c++ if /text/}

print $c; <> 

.
угадайте чему равно $c?  -  999424 (!), странно, а почему не миллион?

Во первых. Зачем вам отключать буферизацию? Вы знаете что код с буферизацией значительно быстрее работает чем код с отключенной буферизацией? И в вашем коде есть грубейшая ошибка. В результате который вы получаете такой странный результат. В любой литературе по программированию в разделе работы с файлами. Написано ОБЯЗАТЕЛЬНО ЗАКРЫВАЙТЕ ОТКРЫТЫЕ ФАЙЛОВЫЕ МАНИПУЛЯТОРЫ КОГДА ОНИ ВАМ БОЛЬШЕ НЕ НУЖНЫ!!!

Код

$| = 1;

open (OU1,">1.txt");
for (1 .. 1000000) {print OU1 "text\n"}
close OU1;
open(IN1, "1.txt");
while(<IN1>){$c++ if /text/}

print $c;
close IN1;


Вывод: 1000000
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




[ Время генерации скрипта: 0.0756 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.