Снегопат

Обсуждение Снегопата
Текущее время: 09 дек 2024, 20:08

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 72 ]  На страницу 1, 2, 3, 4, 5 ... 8  След.
Автор Сообщение
 Заголовок сообщения: rex-v8. ВК для работы с регэкспами.
СообщениеДобавлено: 09 апр 2013, 00:13 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:04
Сообщения: 2052
Обновлено 15.04.2013

Скачать
Описание


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: rex-v8. ВК для работы с регэкспами.
СообщениеДобавлено: 09 апр 2013, 01:09 
Не в сети

Зарегистрирован: 12 ноя 2012, 17:51
Сообщения: 160
Класс!


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: V8RegEx - нативная замена VBRegExp
СообщениеДобавлено: 09 апр 2013, 13:37 
Не в сети

Зарегистрирован: 13 фев 2012, 21:15
Сообщения: 190
Провел строгие замеры выполнения кода на клиенте (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.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: rex-v8. ВК для работы с регэкспами.
СообщениеДобавлено: 09 апр 2013, 14:07 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:04
Сообщения: 2052
Скорее всего VB при присваивании Pattern просто видит, что он не изменился, и не перекомпиливает его. В моей ВК всегда происходит переподготовка выражения. Попробуй проверь так:
Код:
Шаблоны = Новый Массив(2)
Шаблоны[0] = "\d+"
Шаблоны[1] = "\D+"
...
ре.Pattern = Шаблоны[Количество % 2];
...
ре.Шаблон =  Шаблоны[Количество % 2];


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: rex-v8. ВК для работы с регэкспами.
СообщениеДобавлено: 09 апр 2013, 15:43 
Не в сети

Зарегистрирован: 13 фев 2012, 21:15
Сообщения: 190
Вот новый замер.

Код:
ПодключитьВнешнююКомпоненту("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. ВК для работы с регэкспами.
СообщениеДобавлено: 12 апр 2013, 09:29 
Не в сети

Зарегистрирован: 13 фев 2012, 21:15
Сообщения: 190
А где же свойство группы FirstIndex?


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: rex-v8. ВК для работы с регэкспами.
СообщениеДобавлено: 12 апр 2013, 09:37 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:04
Сообщения: 2052
В этой версии есть метод Начало()
Но сегодня я выложу новую версию, интерфейс там другой будет.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: rex-v8. ВК для работы с регэкспами.
СообщениеДобавлено: 12 апр 2013, 09:38 
Не в сети

Зарегистрирован: 13 фев 2012, 21:15
Сообщения: 190
Неудобно портировать код с VBRegExp, т.к. там метод SubMatches подгруппы нумерует с нуля, а ты сделал с 1. Понятно, что хотел упростить объектную модель, но несколько усложнил переход, т.к. иногда переход не случается с первого раз и приходится делать откат и потом снова пробовать. В общем думаю объектную модель было бы неплохо сделать более совместимой с очень распространенным в коде 1С VBRegExp. Но конечно же, не стоит приносить в жертву скорость и гибкость.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: rex-v8. ВК для работы с регэкспами.
СообщениеДобавлено: 12 апр 2013, 09:41 
Не в сети

Зарегистрирован: 13 фев 2012, 21:15
Сообщения: 190
orefkov писал(а):
Но сегодня я выложу новую версию, интерфейс там другой будет.

Вовремя я написал)


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: rex-v8. ВК для работы с регэкспами.
СообщениеДобавлено: 12 апр 2013, 09:45 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:04
Сообщения: 2052
Код все равно не сделать полностью совместимым.
Сами регэкспы изменятся. Например, для задания регистронезависимого поиска в VBScript надо присваивать свойство, а здесь
надо в тексте выражения писать (?i), и так далее.
Поэтому все-равно надо написать функции-обертки над ними - создание, поиск, перебор результатов.
Один раз написать набор таких функций - и использовать.


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 72 ]  На страницу 1, 2, 3, 4, 5 ... 8  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB