Снегопат
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/