Перейти к содержимому
Наше приложение «Дешевые авиабилеты» в 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'а генератор последовательности истинно, не псевдо, случайных чисел. Что оказалось невозможным здесь. Прошу совета, как сделать (или где взять) искомый генератор.

    Добавить комментарий

    Ваш комментарий будет опубликован после прохождения обязательной модерации. Исходящие ссылки не допускаются. Время модерации составит от нескольких минут до нескольких часов в зависимости от времени суток и занятости модератора.