Перейти к содержимому
Наше приложение «Дешевые авиабилеты» в AppGallery >>

VBA Excel. Функция MicroTimer

    Пользовательская функция MicroTimer предназначена для более точного определения времени работы процедур VBA Excel, чем с помощью функции Timer.

    Функция MicroTimer

    MicroTimer – это пользовательская функция, которая использует вызовы Windows API для получения значений системного таймера высокого разрешения, который встроен в большинство процессоров. Автор функции – Чарльз Уильямс.

    Пользовательская функция MicroTimer позволяет более точно определять время работы процедур и отдельных участков кода VBA Excel, чем функция Timer.

    Объявление функций Windows API

    Код объявления функций Windows API «getFrequency» и «getTickCount» для вставки в раздел «Declarations» модуля VBA Excel:

    Если у вас 64-разрядная версия приложения Excel, добавьте ключевое слово PtrSafe:

    Код функции MicroTimer

    Код пользовательской функции MicroTimer для размещения в любом месте программного модуля ниже раздела «Declarations»:

    Функция MicroTimer
    Пример размещения функции MicroTimer в стандартном модуле

    Частота встроенного в процессор таймера – постоянная величина, зависящая только от вашего процессора. Узнать эту частоту можно с помощью следующего кода (функция Windows API «getFrequency» уже должна быть объявлена в разделе Declarations):

    Код определения времени

    Шаблон кода VBA Excel для определения времени работы процедур и отдельных участков кода с помощью функции MicroTimer:

    Переменные:

    • StartTime – значение функции MicroTimer перед началом работы тестируемого кода.
    • ElapsedTime – время работы тестируемого кода в секундах.

    Пример кода с MicroTimer

    Пример кода VBA Excel для сравнения точности измерения времени работы цикла For… Next с помощью функций Timer и MicroTimer:

    Значение переменной ElapsedTime преобразуется в тип данных Decimal (CDec), чтобы значение меньше единицы не преобразовывалось автоматически в экспоненциальную форму.

    Один из результатов работы кода:

    Сравнение точности измерений с помощью функций Timer и MicroTimer
    Сравнение точности измерений с помощью функций Timer и MicroTimer

    Как видно на скриншоте, при количестве итераций цикла 10000 и 100000, определить время выполнения цикла с помощью функции Timer не удалось.


    Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

    1 комментарий для “VBA Excel. Функция MicroTimer”

    1. Сбитый Лётчик Небосводов

      Здравствуйте, Евгений!
      Здравствуйте, коллеги!
      Что-то MicroTimer не вызвал доверия:
      getFrequency возвращает не верную частоту процессора (у меня).
      И самое непонятное в getTickCount: дробные части Count’ов не равномерно распределены в (0;0,(9)) – есть проседание в (0;0,1) и подъём в (0,1;0,(3)), далее до 0,(9) вроде ожидаемо равномерно. Код, который показывает это:
      Option Explicit
      Declare PtrSafe Function getTickCount Lib "kernel32" Alias "QueryPerformanceCounter" (cyTickCount As Currency) As Long
      Sub hh()
      Dim i&, TmrDig@, s0&, s1&, s2&, s3&
      s0 = 0: s1 = 0: s2 = 0: s3 = 0
      For i = 0 To 111111111 '11
      getTickCount TmrDig
      ' TmrDig = TmrDig * 100
      TmrDig = TmrDig - Int(TmrDig)
      If TmrDig < 1 / 3 Then s0 = s0 + 1 Else If TmrDig < 2 / 3 Then s1 = s1 + 1 Else s2 = s2 + 1
      ' If TmrDig < 0.25 Then s0 = s0 + 1 Else If TmrDig < 0.5 Then s1 = s1 + 1 Else If TmrDig < 0.75 Then s2 = s2 + 1 Else s3 = s3 + 1
      ' If TmrDig < 0.1 Then s0 = s0 + 1 Else s1 = s1 + 1
      Next
      Debug.Print i, Round(s0 / i, 3), Round(s1 / i, 3), Round(s2 / i, 3), Round(s3 / i, 3)
      End Sub

      P.S. не по теме. Забрёл я сюда в надежде слепить из MicroTimer'а генератор последовательности истинно, не псевдо, случайных чисел. Что оказалось невозможным здесь. Прошу совета, как сделать (или где взять) искомый генератор.

    Обсуждение закрыто.