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
Доброе время суток На 1000000 повторений: 1 версия 4,734375 4,617188 4,585938 2 версия 4,492188 4,515625 4,523438 Третья версия
Скрытый текст
Код
Public Sub test3()
Const txt As String = "text123"
Dim r1 As Object, r2 As Object
Dim t As Single, i As Long
Dim k1 As String, k2 As String
t = Timer
Set r1 = CreateObject("VBScript.RegExp"): r1.Pattern = "[a-z]+"
Set r2 = CreateObject("VBScript.RegExp"): r2.Pattern = "\d+"
For i = 1 To 1000000
k1 = r1.Execute(txt)(0).Value
k2 = r2.Execute(txt)(0).Value
Next
Debug.Print Timer - t
End Sub
3,0625 3,0625 3,054688 Четвёртая версия
Скрытый текст
Код
Public Sub test3()
Const txt As String = "text123"
Dim r1 As New RegExp, r2 As New RegExp
Dim t As Single, i As Long
Dim k1 As String, k2 As String
t = Timer
r1.Pattern = "[a-z]+"
r2.Pattern = "\d+"
For i = 1 To 1000000
k1 = r1.Execute(txt)(0).Value
k2 = r2.Execute(txt)(0).Value
Next
Debug.Print Timer - t
End Sub
не думаю, что выгоды от применения оптимального метода перевесят затраты времени, которые необходимы на придумывание методики оценки и последующие тесты и даже не в этом дело, а если задача хоть сколько-то интересна тогда совершенно не важно сколько времени будет убито на ее решение в общем - удачи!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Андрей VG написал: P. S. А собственно в чём вопрос?
Тёзка, привет. Да вопрос собственно в том, стоит ли менять два (или более) объекта RegExp, болтающиеся в памяти до закрытия файла, на один, убиваемый по окончанию работы кода? Или сия овчинка выделки не стоит? Это все Мелкий виноват - обозвал тему так. Разница в 0,3 сек (вероятно, на создание второго RegExp) погоды не делает. Четвёртая версия не канает, виду возможой не совместимости библиотек. (Ну, и вообще, мне просто не нравится раннее связывание) Третья версия не канает, поскольку функции все же сложнее, и вызываются в 4 циклах по разным массивам и разному набору условий.
Иной раз не вижу смысла вводить новые переменные, если они используются один раз в начале. Если код не большой и всё логически понятно, то можно и не использовать других переменных, если они по описанию идентичны. Другое дело если код громоздкий и переменные логически удобно читать по их названию. Я иногда одну переменную на протяжение всего кода использую в разных циклах, а смысл заводить новые, если всё последовательно и логично. Описал её объектом или какой-нибудь Integer и дальше пихаешь. Но как сказал выше, иногда лучше логически описывать названием в больших кодах.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. А в том, чтобы писать программы, работающие при любом количестве ошибок.
RAN написал: Разница в 0,3 сек (вероятно, на создание второго RegExp) погоды не делает.
Тёзка, а как была найдена разница? На мой взгляд, там всё в пределах погрешности - в лучшем случае, если подбить статистику по трём запускам в 0,135 секунды разницы между средним, а если посчитать доверительный интервал для среднего? Но, можно же первый вариант сделать и по человечески Железо и Excel другие Вариант 1 11,62891 11,48438 11,50391 Вариант 1 дополненный
Скрытый текст
Код
Sub test1()
Dim t As Single, i As Long
t = Timer
txt = "text123"
For i = 1 To 1000000
k1 = r1(txt)
k2 = r2(txt)
Next
Debug.Print Timer - t
End Sub
Function r1$(txt)
Static objRegExp As Object
If objRegExp Is Nothing Then
Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.Pattern = "[a-z]+"
End If
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+"
End If
r2 = objRegExp.Execute(txt)(0)
End Function
7,730469 7,808594 7,753906
Цитата
RAN написал: Ну, и вообще, мне просто не нравится раннее связывание
Я же не настаиваю, если разница в расчётах 0,01 секунды или 0,02 секунды - то её нет для пользователя. Тогда лучше делать универсальное решение, максимально сопровождаемое и переиспользуемое. Но если одни сутки или двое суток? Тут вопрос философский, что важнее - абсолютных решений нет, увы, Игорь прав.
Здравствуйте, коллеги! Еще пример аналогичной техники (удобно при использовании примеров разработчика).
Код
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. А задумался уже существенно позже.