Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2014, 06:19   #1
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию Очень сильно замедляется регулярка RegExpr

Вобщем проблема такая - очень сильно замедляется регулярка RegExpr, сначала работает быстро а потом с каждым разом все больше и больше замедляется, как решить проблему? В потоке строку:
Код:
sMemo1.Lines.Add(RegExp.Match[1]);
не синхронизирую (пробовал и синхронизировать - разницу не заметил). Спасибо.

Код:
Код:
var
RegExp:TRegExpr;
i:integer;
begin
RegExp:=TRegExpr.Create;
RegExp.Expression:='от(.*?)до';
for i:=0 to 100 do
begin
if RegExp.Exec('переменная') then
begin
repeat
sMemo1.Lines.Add(RegExp.Match[1]);
until not RegExp.ExecNext;
end;
end;
RegExp.Free;
end;
FleXik вне форума Ответить с цитированием
Старый 11.02.2014, 09:05   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, зачем Вам безумный цикл от 0 до 100 ??!!!!
Начните с того, что уберите его!

во-вторых, использовать визуальные компоненты в потоке (даже ещё и без синхронизации) - это как-то не комильфо!

ну и в третьих, так, в порядке бреда...
а если написать так:
Код:
if RegExp.Exec('переменная') then
begin
  repeat
  until not RegExp.ExecNext;
end;
скорость падает?

а если так?
Код:
s := '';
if RegExp.Exec('переменная') then
begin
  repeat
     s := s + #13 + RegExp.Match[1];
  until not RegExp.ExecNext;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.02.2014, 09:13   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

ИМХО тут не регулярка тупит а прорисовка.
Код:
sMemo1.Lines.BeginUpdate;
for i:=0 to 100 do
...
end;
sMemo1.Lines.EndUpdate;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.02.2014, 09:52   #4
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

решил.....

Последний раз редактировалось FleXik; 11.02.2014 в 10:44.
FleXik вне форума Ответить с цитированием
Старый 11.02.2014, 10:19   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
соответственно все в цикле, или я не прав?
насколько я вижу из приведённого вами примера - i не используется.
Поэтому, скорее всего, ВЫ НЕ ПРАВЫ!

кто Вам мешает убрать (закомментировать строчку с for ) и проверить?!


p.s. в моём сообщении выше даны ДВА примера кода. И спрашивалось, как это влияет на перерисовку. Вы ничего не ответили!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.02.2014, 10:24   #6
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Serge_Bliznykov, у меня не совсем i цикл) дал как пример, я использую такой цикл:

Код:
var
b:Boolean;
begin
b:=True;
while b=True do
begin
//запрос + регулярки
end;
end;

Код:
if RegExp.Exec('переменная') then
begin
  repeat
  until not RegExp.ExecNext;
end;
этот ваш пример не очень удачный, т.к я именно так и использую только у меня еще выводится результат в sRichEdit, а второй вариант сейчас попробую и отпишу.

Последний раз редактировалось FleXik; 11.02.2014 в 10:38.
FleXik вне форума Ответить с цитированием
Старый 11.02.2014, 10:36   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
sMemo1.Lines.BeginUpdate;
for i:=0 to 100 do
...
end;
sMemo1.Lines.EndUpdate;
Не поможет. В методах TStrings и так эти скобки поставлены на каждый чих.
Реально ускорить может только замена TMemo на TSringList. А если конечный итог нужно видеть в Мемо, то после окончания цикла сбрасывать в мемо из стринглиста все разом через AddStrings.
northener вне форума Ответить с цитированием
Старый 11.02.2014, 10:38   #8
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

всееее сам решил проблему))) вобщем у меня был не правильно составлен код внутри регулярки, у меня внутри регулярки было еще несколько проверок, пример:

было:
Код:
while b=True do
begin
// запрос
if RegExp.Exec('переменная запроса') then
begin
repeat
if Pos(RegExp.Match[1], Form1.sRichEdit1.Lines.Text)=0 then
Form1.sRichEdit1.Lines.Add(RegExp.Match[1]);
until not RegExp.ExecNext;
end;
end;
стало:
Код:
while b=True do
begin
// запрос
if RegExp.Exec('переменная запроса') then
begin
if Pos(RegExp.Match[1], Form1.sRichEdit1.Lines.Text)=0 then
repeat
Form1.sRichEdit1.Lines.Add(RegExp.Match[1]);
until not RegExp.ExecNext;
end;
end;
конечно проверок аж 3шт и я их пихало прямо в repeat - until а нужно было за него выводить скорость жестко поднялась и стабильно работает

Последний раз редактировалось FleXik; 11.02.2014 в 10:52.
FleXik вне форума Ответить с цитированием
Старый 11.02.2014, 10:48   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Не поможет. В методах TStrings и так эти скобки поставлены на каждый чих.
Поможет. Отрисовку убирает ускоряя процесс попадания строки в список. Сам пользуюсь часто.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ПРИВЕТ ВСЕМ! Очень сильно нужна ваша потдержка(экзамен в понедельник ), огромная просьба отписаться..Буду премного благодарен..) SwAAAte83 Паскаль, Turbo Pascal, PascalABC.NET 1 20.01.2012 09:41
греется видеокарта очень сильно и очень быстро, tokloo Компьютерное железо 1 28.05.2011 11:39
Записи нужно очень сильно. brunetk0 Паскаль, Turbo Pascal, PascalABC.NET 3 22.05.2010 17:52