Снегопат https://snegopat.ru/forum/ |
|
rex-v8. ВК для работы с регэкспами. https://snegopat.ru/forum/viewtopic.php?f=5&t=444 |
Страница 1 из 8 |
Автор: | orefkov [ 09 апр 2013, 00:13 ] |
Заголовок сообщения: | rex-v8. ВК для работы с регэкспами. |
Обновлено 15.04.2013 Скачать Описание |
Автор: | also [ 09 апр 2013, 01:09 ] |
Заголовок сообщения: | Re: rex-v8. ВК для работы с регэкспами. |
Класс! |
Автор: | tormozit [ 09 апр 2013, 13:37 ] |
Заголовок сообщения: | V8RegEx - нативная замена VBRegExp |
Провел строгие замеры выполнения кода на клиенте (32b версия ВК) в консоли кода (ИР), в которой есть специальные функции для проведения сравнительных замеров с контролем отключенности отладчика. Код: ПодключитьВнешнююКомпоненту("D:\Program Files\1cv82\common\rex32.dll", "V8RegEx", ТипВнешнейКомпоненты.Native); текст = "луоалаокоащроощурагк кашгкаршгукрашгукр 87677 ыолвраылораыолршгр 8777 ыолвапаоыпорыпа рыпарваорпаырпа 999"; Количество = 100000; ре = Новый("V8RegEx"); ЛксНачатьЗамер(Количество); Для К = 1 По Количество Цикл результат1 = Новый Массив; ре.Шаблон = "\d+"; ре.Строка = текст; Пока ре.Найти() Цикл результат1.Добавить(ре.Группа(0)); КонецЦикла; КонецЦикла; ЛксКончитьЗамер(); ре = Новый COMОбъект("Vbscript.RegExp"); ре.Global = Истина; ЛксНачатьЗамер(Количество); Для К = 1 По Количество Цикл результат2 = Новый Массив; ре.Pattern = "\d+"; м = ре.Execute(текст); ЧислоВхождений = м.Count(); Для у = 0 По ЧислоВхождений - 1 Цикл результат2.Добавить(м.Item(у).Value); КонецЦикла; КонецЦикла; ЛксКончитьЗамер(); /////////////////////////////////////// ре = Новый("V8RegEx"); ре.Шаблон = "\d+"; ЛксНачатьЗамер(Количество); Для К = 1 По Количество Цикл результат1 = Новый Массив; ре.Строка = текст; Пока ре.Найти() Цикл результат1.Добавить(ре.Группа(0)); КонецЦикла; КонецЦикла; ЛксКончитьЗамер(); ре = Новый COMОбъект("Vbscript.RegExp"); ре.Global = Истина; ре.Pattern = "\d+"; ЛксНачатьЗамер(Количество); Для К = 1 По Количество Цикл результат2 = Новый Массив; м = ре.Execute(текст); ЧислоВхождений = м.Count(); Для у = 0 По ЧислоВхождений - 1 Цикл результат2.Добавить(м.Item(у).Value); КонецЦикла; КонецЦикла; ЛксКончитьЗамер(); Результаты: Цитата: Окончание замера "Замер_31" - Длительность = 5с, Среднее = 0.00005 с Окончание замера "Замер_32" - Длительность = 2.565с, Среднее = 0.00002565 с Окончание замера "Замер_33" - Длительность = 0.774с, Среднее = 0.00000774 с Окончание замера "Замер_34" - Длительность = 2.359с, Среднее = 0.00002359 с Выводы 1. Если не менять свойство "Шаблон"/"Pattern", то работает в 3 раза быстрее, чем VBшная. 2. Если не менять свойство "Шаблон"/"Pattern", то работает в 2 раза медленнее чем VBшная. 3. Установка свойства "Шаблон" либо пока реализована криво (очень хотелось бы надеяться что это так ![]() |
Автор: | orefkov [ 09 апр 2013, 14:07 ] |
Заголовок сообщения: | Re: rex-v8. ВК для работы с регэкспами. |
Скорее всего VB при присваивании Pattern просто видит, что он не изменился, и не перекомпиливает его. В моей ВК всегда происходит переподготовка выражения. Попробуй проверь так: Код: Шаблоны = Новый Массив(2)
Шаблоны[0] = "\d+" Шаблоны[1] = "\D+" ... ре.Pattern = Шаблоны[Количество % 2]; ... ре.Шаблон = Шаблоны[Количество % 2]; |
Автор: | tormozit [ 09 апр 2013, 15:43 ] |
Заголовок сообщения: | Re: rex-v8. ВК для работы с регэкспами. |
Вот новый замер. Код: ПодключитьВнешнююКомпоненту("D:\Program Files\1cv82\common\rex32.dll", "V8RegEx", ТипВнешнейКомпоненты.Native); текст = "луоалаокоащроощурагк кашгкаршгукрашгукр 87677 ыолвраылораыолршгр 8777 ыолвапаоыпорыпа рыпарваорпаырпа 999"; Количество = 100000; ре = Новый("V8RegEx"); ЛксНачатьЗамер(Количество); Для К = 1 По Количество Цикл результат1 = Новый Массив; ре.Шаблон = ""; ре.Шаблон = "\d+"; ре.Строка = текст; Пока ре.Найти() Цикл результат1.Добавить(ре.Группа(0)); КонецЦикла; КонецЦикла; ЛксКончитьЗамер(); ре = Новый COMОбъект("Vbscript.RegExp"); ре.Global = Истина; ЛксНачатьЗамер(Количество); Для К = 1 По Количество Цикл результат2 = Новый Массив; ре.Pattern = ""; ре.Pattern = "\d+"; м = ре.Execute(текст); ЧислоВхождений = м.Count(); Для у = 0 По ЧислоВхождений - 1 Цикл результат2.Добавить(м.Item(у).Value); КонецЦикла; КонецЦикла; ЛксКончитьЗамер(); /////////////////////////////////////// ре = Новый("V8RegEx"); ре.Шаблон = "\d+"; ЛксНачатьЗамер(Количество); Для К = 1 По Количество Цикл результат1 = Новый Массив; ре.Строка = текст; Пока ре.Найти() Цикл результат1.Добавить(ре.Группа(0)); КонецЦикла; КонецЦикла; ЛксКончитьЗамер(); ре = Новый COMОбъект("Vbscript.RegExp"); ре.Global = Истина; ре.Pattern = "\d+"; ЛксНачатьЗамер(Количество); Для К = 1 По Количество Цикл результат2 = Новый Массив; м = ре.Execute(текст); ЧислоВхождений = м.Count(); Для у = 0 По ЧислоВхождений - 1 Цикл результат2.Добавить(м.Item(у).Value); КонецЦикла; КонецЦикла; ЛксКончитьЗамер(); Результаты те же: Цитата: Окончание замера "Замер_37" - Длительность = 5.001с, Среднее = 0.00005001 с
Окончание замера "Замер_38" - Длительность = 2.63с, Среднее = 0.0000263 с Окончание замера "Замер_39" - Длительность = 0.77с, Среднее = 0.0000077 с Окончание замера "Замер_40" - Длительность = 2.346с, Среднее = 0.00002346 с |
Автор: | tormozit [ 12 апр 2013, 09:29 ] |
Заголовок сообщения: | Re: rex-v8. ВК для работы с регэкспами. |
А где же свойство группы FirstIndex? |
Автор: | orefkov [ 12 апр 2013, 09:37 ] |
Заголовок сообщения: | Re: rex-v8. ВК для работы с регэкспами. |
В этой версии есть метод Начало() Но сегодня я выложу новую версию, интерфейс там другой будет. |
Автор: | tormozit [ 12 апр 2013, 09:38 ] |
Заголовок сообщения: | Re: rex-v8. ВК для работы с регэкспами. |
Неудобно портировать код с VBRegExp, т.к. там метод SubMatches подгруппы нумерует с нуля, а ты сделал с 1. Понятно, что хотел упростить объектную модель, но несколько усложнил переход, т.к. иногда переход не случается с первого раз и приходится делать откат и потом снова пробовать. В общем думаю объектную модель было бы неплохо сделать более совместимой с очень распространенным в коде 1С VBRegExp. Но конечно же, не стоит приносить в жертву скорость и гибкость. |
Автор: | tormozit [ 12 апр 2013, 09:41 ] |
Заголовок сообщения: | Re: rex-v8. ВК для работы с регэкспами. |
orefkov писал(а): Но сегодня я выложу новую версию, интерфейс там другой будет. Вовремя я написал) |
Автор: | orefkov [ 12 апр 2013, 09:45 ] |
Заголовок сообщения: | Re: rex-v8. ВК для работы с регэкспами. |
Код все равно не сделать полностью совместимым. Сами регэкспы изменятся. Например, для задания регистронезависимого поиска в VBScript надо присваивать свойство, а здесь надо в тексте выражения писать (?i), и так далее. Поэтому все-равно надо написать функции-обертки над ними - создание, поиск, перебор результатов. Один раз написать набор таких функций - и использовать. |
Страница 1 из 8 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |