rex-v8. ВК для работы с регэкспами.
V8RegEx - нативная замена VBRegExp
Провел строгие замеры выполнения кода на клиенте (32b версия ВК) в консоли кода (ИР), в которой есть специальные функции для проведения сравнительных замеров с контролем отключенности отладчика.
Результаты:
Выводы
1. Если не менять свойство "Шаблон"/"Pattern", то работает в 3 раза быстрее, чем VBшная.
2. Если не менять свойство "Шаблон"/"Pattern", то работает в 2 раза медленнее чем VBшная.
3. Установка свойства "Шаблон" либо пока реализована криво (очень хотелось бы надеяться что это так
), либо туда "перетекает" куча предварительных действий перед поиском, которые VBшная выполняет при Execute.
Код: Выделить всё
ПодключитьВнешнююКомпоненту("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. Установка свойства "Шаблон" либо пока реализована криво (очень хотелось бы надеяться что это так
Re: rex-v8. ВК для работы с регэкспами.
Скорее всего VB при присваивании Pattern просто видит, что он не изменился, и не перекомпиливает его. В моей ВК всегда происходит переподготовка выражения. Попробуй проверь так:
Код: Выделить всё
Шаблоны = Новый Массив(2)
Шаблоны[0] = "\d+"
Шаблоны[1] = "\D+"
...
ре.Pattern = Шаблоны[Количество % 2];
...
ре.Шаблон = Шаблоны[Количество % 2];
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 с
Re: rex-v8. ВК для работы с регэкспами.
А где же свойство группы FirstIndex?
Re: rex-v8. ВК для работы с регэкспами.
В этой версии есть метод Начало()
Но сегодня я выложу новую версию, интерфейс там другой будет.
Но сегодня я выложу новую версию, интерфейс там другой будет.
Re: rex-v8. ВК для работы с регэкспами.
Неудобно портировать код с VBRegExp, т.к. там метод SubMatches подгруппы нумерует с нуля, а ты сделал с 1. Понятно, что хотел упростить объектную модель, но несколько усложнил переход, т.к. иногда переход не случается с первого раз и приходится делать откат и потом снова пробовать. В общем думаю объектную модель было бы неплохо сделать более совместимой с очень распространенным в коде 1С VBRegExp. Но конечно же, не стоит приносить в жертву скорость и гибкость.
Re: rex-v8. ВК для работы с регэкспами.
orefkov писал(а):Но сегодня я выложу новую версию, интерфейс там другой будет.
Вовремя я написал)
Re: rex-v8. ВК для работы с регэкспами.
Код все равно не сделать полностью совместимым.
Сами регэкспы изменятся. Например, для задания регистронезависимого поиска в VBScript надо присваивать свойство, а здесь
надо в тексте выражения писать (?i), и так далее.
Поэтому все-равно надо написать функции-обертки над ними - создание, поиск, перебор результатов.
Один раз написать набор таких функций - и использовать.
Сами регэкспы изменятся. Например, для задания регистронезависимого поиска в VBScript надо присваивать свойство, а здесь
надо в тексте выражения писать (?i), и так далее.
Поэтому все-равно надо написать функции-обертки над ними - создание, поиск, перебор результатов.
Один раз написать набор таких функций - и использовать.