VBA, MS Access MS Access в примерах

Процедура сравнения скорости работы Процедур (Функций) VBA

Давно уже пользуюсь подобным , наглядно, и сразу видно какой из двух (3х-4х...) вариантов аналогичного кода быстрее работает.
Особенно хорошо помогает при обработке больших обьемов данных.


Пример отпечатает в Immediate окно (Ctrl + G в VBE - кто не знает) примерно такой результат:

--------------------------------------------------
Тест-1 (100 000 000 повт.) работал: 00:00:02 - Целочисленное деление (l \ 3)
Тест-2 (100 000 000 повт.) работал: 00:00:02 - Умножение (l * 3)


Процедура сравнения:

Private Sub esSpeedCompare()
'es 19.05.2003 - 14.11.2019 (LE)
'Процедура сравнения работы процедур или функций по скорости
'Пишет результат в Immediate Window (Кто не в курсе нажмите: [Ctrl+G] в VBE)
'--------------------------------------------------------------------
' Дополнительно инфа:
'   http://www.cyberforum.ru/vba/thread686730.html
'   http://www.askit.ru/custom/vba_office/m6/06_02_04_immediate_window.htm
'--------------------------------------------------------------------
Dim intTest As Integer        'Счетчик тестов
Dim lRet As Long              'Кол-во повторений теста
Dim l As Long                 'Счетчик повторений
Dim t As Date                 'Перменная таймера
Dim v As Variant              'Для приема значений возвращаемых тестируемыми ...
Dim sTest As String           'На тестах может пригодиться
Dim sTestName As String       'Название процедуры|функции для отчёта в Immediate Window

On Error GoTo esSpeedCompare_Err

'Установка количества повторений теста (сразу тысячаповторений, как минимум) 
    lRet = CLng(1000) 'сразу тысячами - и дальше просто умножам (если нужно) ...
    
'Умножение ...
    'lRet = lRet * 10            ' = Мало             - для медленных операций - и начните с этого!
    'lRet = lRet * 500           ' = Побольше         - для "тестируемых" пошустрее ...
    'lRet = lRet * 10000         ' = УЖЕ Много !      - Только для быстрых операций (Внимательно!!!)
    'lRet = lRet * 100000        ' = ОЧЕНЬ Много !!!  - Только для очень быстрых операций (ОТОРОЖНО!!!)


'Отделяем линией от (возможных) предидущих результатов
    Debug.Print String(50, "-")

'Запуск 2-х тестов
    For intTest = 1 To 2
        t = Now
        Select Case intTest 'Расписываем названия для красоты (не обязательно)
            Case 1: sTestName = "Целочисленное деление (l \ 3)" 'Имя тестируеймой 1
            Case 2: sTestName = "Умножение (l * 3)" 'Имя тестируеймой 2
        End Select

        For l = 1 To lRet
            Select Case intTest
                
                Case 1 'ниже пишем певую тестируемую процедуру|функцию
 
                   v = l \ 3 'Операция "от фонаря" (для примера) 
                     
                Case 2 'ниже пишем вторую тестируемую процедуру|функцию

                    v = l * 3 'Операция "от фонаря" (для примера)
                    
            End Select
        Next l
        
        'отчет.....
        Debug.Print "Тест-" & intTest & " (" & Format$(lRet, "#,##0") & _
            " повт.) работал: " & Format(Now - t, "hh:mm:ss") & " - " & sTestName
    Next intTest
    'Debug.Print String(50, "-") '& vbCrLf
esSpeedCompare_Bye:
    Exit Sub

esSpeedCompare_Err:
    Debug.Print "Процедура сравнения работы функций по скорости привела к ошибке:" & vbCrLf & _
    Err.Description
    Resume esSpeedCompare_Bye
End Sub


Achtung!
Если вы не знаете, что такое VBE, и слабо понимаете отличие Прцедуры от Функции, или ваша БД меньше 1000 записей ...
ЭТО вам пока не нужно!

Назад ToTop
L.E. 16.11.2018
Рейтинг@Mail.ru