26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,172
|
|
1 | |
Как ускорить регулярные выражения, не вынося их из функции17.07.2012, 13:39. Показов 4588. Ответов 21
Метки нет (Все метки)
Добрый день!
У меня есть функция compare(), в которой используется 50 регулярных выражений для поиска и(или) замены фрагментов. Во время работы программы данная функция исполняется 10 тысяч раз (обрабатывает каждую строку). Таким образом, даже если в конце регулярного выражения написать RegexOptions.Compiled, то при следующей итерации функции это регулярное выражение заново будет compiled. Я попробовал вынести регексы из функции compare() наверх - в функци "public partial class Form1 : Form", после чего программа заработала в 10 раз быстрее. Но теперь код стал очень неудобный - регулярные выражения объявлены в самом верху программы, а используются совсем в другом месте. Каким образом можно ускорить функцию и оставить код читабельным? Добавлено через 2 минуты Там, где можно было использовать обычный replace, я использовал его, понятное дело.
0
|
17.07.2012, 13:39 | |
Ответы с готовыми решениями:
21
ЧПУ. Замена строк, регулярные выражения. Как правильно использовать переменную в регулярные выражения ? Как Использовать регулярные выражения Как оформлять регулярные выражения? Как работают регулярные выражения |
87 / 73 / 6
Регистрация: 11.09.2011
Сообщений: 118
|
|
17.07.2012, 13:45 | 2 |
Перенесите код из функции compare в тело цикла, а регулярные выражения напишите перед циклом.
0
|
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,172
|
|||||||||||||||||||||
17.07.2012, 13:55 [ТС] | 4 | ||||||||||||||||||||
Интересное предложение, но функция compare() где-то 800 или 900 строк (сложный парсер). Соответственно, даже если мы выносим за цикл, то все равно сложно разобрать, где какие регулярки используются.
Причем, у меня раньше этот парсер был написан на Perl. Там вообще по барабану - скорость огромная (в 2 раза выше c# после всех ухищрений), даже если регулярки используются в цикле. Интерпретатор сразу запоминает регулярное выражение, если в нем нет интерполируемых членов, и при последующем вызове опять применяет его. Добавлено через 4 минуты +B, а как объявить поверх моего метода, если сам метод не использует цикл? Он сам вызывается в цикле. Т.е. сейчас у меня вверху программы написано:
0
|
146 / 143 / 32
Регистрация: 21.01.2012
Сообщений: 545
|
|
17.07.2012, 13:58 | 5 |
регекс объявить статическим внутри метода не поможет?
1
|
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,172
|
|
17.07.2012, 14:03 [ТС] | 7 |
KeBJIaP, что вы имеете в виду, можете пояснить?
Я пробовал внутри метода использовать code = regex.Replace(code, (.+)/(?:20|19)(\\d\\d)$, "$1/$2"); и code = regex.Replace(code, (.+)/(?:20|19)(\\d\\d)$, "$1/$2", RegexOptions|Compiled); разницы никакой - одинаково медленно. Потому что сам метод вызывается 10 тысяч раз. Скорость увеличивается только, если вынести определения regex за пределы метода. Но тогда код невозможно читать. Добавлено через 1 минуту Там коммерческий алгоритм, очень сложный. Я его на Perl в течение трех лет писал и дорабатывал. Теперь на c# переношу, поэтому не могу выложить...
0
|
146 / 143 / 32
Регистрация: 21.01.2012
Сообщений: 545
|
||||||
17.07.2012, 14:13 | 8 | |||||
Спутал
Объяви весь метод статическим мож поможет Добавлено через 6 минут Можно создать статический метод для замены сразу
1
|
57 / 57 / 15
Регистрация: 22.09.2011
Сообщений: 319
|
|
17.07.2012, 14:15 | 9 |
Покажите весь листинг парсера
1
|
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,172
|
|
17.07.2012, 14:20 [ТС] | 10 |
KeBJIaP, интересно! Сегодня попробую.
Только переменная code является локальной для функции compare(). Мне кажется, в этом будет проблема. Добавлено через 1 минуту Не Мой ник слишком хорошо знают конкуренты и коллеги. Украдут код, кто потом будет зарплату платить?
0
|
57 / 57 / 15
Регистрация: 22.09.2011
Сообщений: 319
|
|
17.07.2012, 14:24 | 11 |
А что такое Вы парсите - чтобы 10 тысяч раз вызывать один и тот же метод?
0
|
146 / 143 / 32
Регистрация: 21.01.2012
Сообщений: 545
|
|||||||||||
17.07.2012, 14:31 | 12 | ||||||||||
1
|
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,172
|
|
17.07.2012, 14:36 [ТС] | 13 |
0
|
146 / 143 / 32
Регистрация: 21.01.2012
Сообщений: 545
|
||||||
17.07.2012, 14:37 | 14 | |||||
Понеслась душа по кочкам)
0
|
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,172
|
|
17.07.2012, 14:40 [ТС] | 15 |
Мне кажется, этот код ничем не отличается от определения регулярок выше метода.
Т.е. все равно у вас регулярки определяются вверху, а используются на много страниц ниже. Мне же интересно, можно ли записывать регексы внутри метода так, чтобы код было легко читать и скорость была приличной.
0
|
57 / 57 / 15
Регистрация: 22.09.2011
Сообщений: 319
|
|
17.07.2012, 14:51 | 16 |
А как Вы из баз делаете сравнение по времени работы наполнения баз данных?
0
|
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,172
|
|
17.07.2012, 14:59 [ТС] | 17 |
В одной базе данных такой документ:
Закон Краснодарского края от 31.05.2005 N 870-КЗ (ред. от 02.03.2012) <О государственной гражданской службе Краснодарского края> (принят ЗС КК 25.05.2005) В другой базе данных документ выглядит так: Краевой Закон от 31 мая 2005 г. N 870-К3 "О государственной гражданской службе Краснодарского края" Необходимо находить одинаковые документы в двух БД, потом сравнивать атрибуты этих документов. Вариантов написания названий документов, различных особенностей очень много в каждом регионе. Необходимо все учитывать. В каждой базе данных по 5 млн. документов. Делаются "кусочные" сравнения по каждому региону.
0
|
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
|
|||||||||||
17.07.2012, 15:03 | 18 | ||||||||||
Регулярки кешируются сами если использовать статические методы
0
|
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,172
|
||||||
17.07.2012, 15:07 [ТС] | 19 | |||||
m0nax, так я и так использую
А в каком месте нужно применять Regex.CacheSize?
0
|
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
|
|
17.07.2012, 15:09 | 20 |
regex и Regex разные вещи, первый это название переменной, а второй имя класса
0
|
17.07.2012, 15:09 | |
17.07.2012, 15:09 | |
Помогаю со студенческими работами здесь
20
Как работают регулярные выражения? Как составляются регулярные выражения? Как вставить картинку, регулярные выражения Как Регулярные Выражения Прикрутить К Lotusscript? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |