Страницы: 1
RSS
Объект RegExp. Использовать один или два? Плюсы и минусы.
 
Мяв.
Не запариваясь, сочинил код
Код
Sub test1()
txt = "text123"
k1 = r1(txt)
k2 = r2(txt)
End Sub
Function r1$(txt)
Static objRegExp As Object
If objRegExp Is Nothing Then Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.Pattern = "[a-z]+"
r1 = objRegExp.Execute(txt)(0)
End Function
Function r2$(txt)
Static objRegExp As Object
If objRegExp Is Nothing Then Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.Pattern = "\d+"
r2 = objRegExp.Execute(txt)(0)
End Function

где каждая функция использует свой RegExp.
После задумался, есть ли смысл переделать на код с одним RegExp?
Код
Sub test2()
Dim objRegExp As Object
txt = "text123"
Set objRegExp = CreateObject("VBScript.RegExp")
k1 = r11(objRegExp, txt)
k2 = r21(objRegExp, txt)
End Sub
Function r11$(objRegExp As Object, txt)
objRegExp.Pattern = "[a-z]+"
r11 = objRegExp.Execute(txt)(0)
End Function
Function r21$(objRegExp As Object, txt)
objRegExp.Pattern = "\d+"
r21 = objRegExp.Execute(txt)(0)
End Function

Что скажете?
Изменено: RAN - 19.10.2019 19:52:41
 
Доброе время суток
На 1000000 повторений:
1 версия
4,734375
4,617188
4,585938
2 версия
4,492188
4,515625
4,523438
Третья версия
Скрытый текст

3,0625
3,0625
3,054688
Четвёртая версия
Скрытый текст

2,476563
2,515625
2,453125

P. S. А собственно в чём вопрос?
Изменено: Андрей VG - 19.10.2019 20:44:19
 
не думаю, что выгоды от применения оптимального метода  перевесят затраты времени, которые необходимы на придумывание методики оценки и последующие тесты
и даже не в этом дело, а если задача хоть сколько-то интересна  тогда совершенно не важно сколько времени будет убито на ее решение
в общем - удачи!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Андрей VG написал:
P. S. А собственно в чём вопрос?
Тёзка, привет.
Да вопрос собственно в том, стоит ли менять два (или более) объекта RegExp, болтающиеся в памяти до закрытия файла, на один, убиваемый по окончанию работы кода?
Или сия овчинка выделки не стоит?
Это все Мелкий виноват - обозвал тему так.
Разница в 0,3 сек (вероятно, на создание второго RegExp) погоды не делает.
Четвёртая версия не канает, виду возможой не совместимости библиотек. (Ну, и вообще, мне просто не нравится раннее связывание)
Третья версия не канает, поскольку функции все же сложнее, и вызываются в 4 циклах по разным массивам и разному набору условий.
 
Цитата
RAN написал: Это все Мелкий виноват -
Не стыдно валить на маленьких? )
Предлагай
 
Иной раз не вижу смысла вводить новые переменные, если они используются один раз в начале. Если код не большой и всё логически понятно, то можно и не использовать других переменных, если они по описанию идентичны. Другое дело если код громоздкий и переменные логически удобно читать по их названию.
Я иногда одну переменную на протяжение всего кода использую в разных циклах, а смысл заводить новые, если всё последовательно и логично. Описал её объектом или какой-нибудь Integer и дальше пихаешь. Но как сказал выше, иногда лучше логически описывать названием в больших кодах.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
RAN написал:
Разница в 0,3 сек (вероятно, на создание второго RegExp) погоды не делает.
Тёзка, а как была найдена разница? ;)  На мой взгляд, там всё в пределах погрешности - в лучшем случае, если подбить статистику по трём запускам в 0,135 секунды разницы между средним, а если посчитать доверительный интервал для среднего?
Но, можно же первый вариант сделать и по человечески :)  Железо и Excel другие
Вариант 1
11,62891
11,48438
11,50391
Вариант 1 дополненный
Скрытый текст

7,730469
7,808594
7,753906
Цитата
RAN написал:
Ну, и вообще, мне просто не нравится раннее связывание
Я же не настаиваю, если разница в расчётах 0,01 секунды или 0,02 секунды - то её нет для пользователя. Тогда лучше делать универсальное решение, максимально сопровождаемое и переиспользуемое. Но если одни сутки или двое суток? Тут вопрос философский, что важнее - абсолютных решений нет, увы, Игорь прав.
Изменено: Андрей VG - 20.10.2019 11:37:03
 
Здравствуйте, коллеги! Еще пример аналогичной техники (удобно при использовании примеров разработчика).
Код
Option Explicit

Public Function fso() As Object
    Static oFso As Object
    If oFso Is Nothing Then
        Set oFso = CreateObject("Scripting.FileSystemObject")
    End If
    Set fso = oFso
End Function

' Пример от разработчика
Function ShowFolderSize(filespec)
    Dim f As Object, s
    Set f = fso.GetFolder(filespec)
    s = UCase(f.Name) & " uses " & f.Size & " bytes."
    ShowFolderSize = s
End Function

Один экземпляр объекта на всё время работы. Сохраняет работоспособность после сброса проекта.
Владимир
 
Тёзка, вот то, что Pattern можно тоже только один раз задать - ступил.
Почему получился такой вариант. Сначала был нужен один RegExp. По ходу пьянки понадобился второй. Не долго думая, скопировал функцию, сменил Pattern. А задумался уже существенно позже.

Владимир, тоже любопытный вариант.
Цитата
vikttur написал:
Предлагай
Объект RegExp. Использовать один или два? Плюсы и минусы.
Страницы: 1
Наверх