Снегопат 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. Установка свойства "Шаблон" либо пока реализована криво (очень хотелось бы надеяться что это так ), либо туда "перетекает" куча предварительных действий перед поиском, которые VBшная выполняет при Execute. |
Автор: | 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/ |