26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,172
|
||||||
1 | ||||||
с++11. Сильно тормозят регулярные выражения29.11.2012, 20:37. Показов 3845. Ответов 19
Метки нет Все метки)
(
Добрый день!
Есть файл "словарь.txt", нужно прочитать его построчно и вывести в файл "результат.txt" только те строки, которые удовлетворяют регулярному выражению. Пишу:
0
|
|
29.11.2012, 20:37 | |
Ответы с готовыми решениями:
19
С++ и регулярные выражения Регулярные выражения Регулярные выражения с++
|
В астрале
![]() 8048 / 4805 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
29.11.2012, 21:22 | 2 |
Suppir, boost::regex попробуйте, вполне возможно что стандартные регексы еще не оптимизированы. А так регекс в С++ вообще не быстрая штука, если что.
0
|
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,172
|
|
30.11.2012, 12:57 [ТС] | 3 |
Мне кажется, медленно работают не только регулярные выражения, но и вот это место: getline(infile, line ).
0
|
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,172
|
|
30.11.2012, 16:40 [ТС] | 5 |
0
|
574 / 557 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
|
|
30.11.2012, 16:59 | 6 |
Suppir, компилите в релизе или дебаге?
0
|
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,172
|
|
30.11.2012, 22:15 [ТС] | 7 |
В релизе немного побыстрей, но все равно медленней, чем Perl на порядок.
0
|
574 / 557 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
|
|
30.11.2012, 22:20 | 8 |
Suppir, поищите на верхней панели инструментов слово Debug. и поменяйте его на релиз
0
|
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,172
|
|
30.11.2012, 22:22 [ТС] | 9 |
Скорость программки на с++ получилась как у медленных скриптовых языков: Ruby или AutoIt.
0
|
574 / 557 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
|
|
30.11.2012, 22:24 | 10 |
Suppir, суть скрипта на перле такая же? там тоже построчное считывание? или сразу весь файл считывается?
0
|
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,172
|
||||||
30.11.2012, 22:30 [ТС] | 12 | |||||
Да, тоже построчно! Аналогичный скрипт на Perl:
0
|
Форумчанин
![]() ![]() 8194 / 5044 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||||||
30.11.2012, 22:33 | 13 | |||||
Вы в С++ считываете построчно, вот, считывает весь текст с файла в строку:
0
|
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,172
|
|
30.11.2012, 22:34 [ТС] | 14 |
Но Perl же написан на том же си/с++, к тому же является интерпретатором (т.о. он должен быть медленней, чем скомпилированная программа).
Кстати, я пишу еще на c# около года. Так вот, на c# (.NET Framework 2.0) после всевозможных ухищрений удалось добиться скорости (в области обработки текста) в 2 раза меньше, чем у Perl. Я надеялся, что с++ пошустрее будет.
0
|
Higher
|
|
30.11.2012, 22:36 | 15 |
Кстати, есть такой бенчмарк.
Как видно из него бусторегексы более чем в 3 раза уступают по скорости гугловой либе(кстати, на первом месте тоже детище гугла), но все же почти в 2 раза быстрее перловых. Это я к тому, что стоит использовать нормальные либы для регексов.
0
|
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,172
|
|
30.11.2012, 22:36 [ТС] | 16 |
А как мне теперь пробежаться по каждой строке? Нужно ж еще разсплитить этот файл в массив.
0
|
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,172
|
|
30.11.2012, 23:04 [ТС] | 18 |
Гуглолиба, вроде, имеет стандарт, аналогичный POSIX, т.е. не поддерживает обратных ссылок. А они жизненно необходимы для обработки текста (поиска-замен).
Добавлено через 5 минут Еще пару слов насчет регулярных выражений в с#. Они сделаны по стандарту Perl, но очень неудобны. Дело в том, что Perl автоматически компилирует (оптимизирует) регулярное выражение, которое не имеет интерполируемых переменных. Если регулярка встречается в цикле, то Perl компилирует его один раз (а не каждый раз, как пытается сделать c#). В с# приходится сначала создавать регулярку с флагом "компилировать", а только потом ее использовать. Причем, создавать регулярки приходится вне цикла, где идет обработка текста. Таким образом получается, что регулярки у вас определены в одной части экрана, а применяются в другой. Это очень неудобно. Добавлено через 6 минут "Таким образом получается, что регулярки у вас определены в одной части экрана, а применяются в другой. Это очень неудобно." Собственно, как и в программе, которую я привел в сабже. Добавлено через 11 минут Кстати, насчет бенчарка. Там сразу видно несколько критичных ошибок в коде Perl. Например, в регулярных выражения используется альтернация квантифицируемых символов (конструкции вроде /a+|b*/). При этом регулярка будет нещадно тормозить. Это общая проблема регулярок на недетерминированных конечных автоматах. Хуже только двойные квантификаторы /([a-z]*)+/ - тогда время поиска вообще взлетает по экспоненте. Нужно альтернацию убирать в код: /a+/ || /b*/. Так будет реально на порядок быстрее. Код для бенчмарка писал человек, который Perl вчера увидел.
0
|
382 / 280 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
26.11.2013, 21:35 | 19 |
0
|
MrGluck
|
26.11.2013, 22:12
с++11. Сильно тормозят регулярные выражения
#20
|
Не по теме: не прошло и года
0
|
26.11.2013, 22:12 | |
Регулярные выражения Регулярные выражения Регулярные выражения. Регулярные выражения Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |