Access. Программирование на VBA

Средства оценки производительности


Разработчику важно знать, какое же влияние оказали на приложение все предпринятые усилия. Для отслеживания и оценки относительной производительности, достигнутой с помощью той или иной ме­тодики, можно использовать несколько разных инструментальных средств. Первый способ — это таймер для измерения количества времени, которое занимает выполнение процесса. Второй способ — недокумен­тированная функция для подсчета операций с диском, кэшем и операций блокировки. Третий способ — способность Access отобразить план выполнения запросов для просмотра разработчиком. Первые два спо­соба можно применять для оценки производительности практически каждой методики, описанной в данной статье. Планы выполнения запросов относятся только к оптимизации запросов.

Хотя VBA содержит функцию Timer(), она может оказаться не совсем точной для оценки предприня­тых усилий по оптимизации. Функция VBA Timer() записывает в секундах промежуток времени, прошед­ший с полуночи. Поскольку измеренное время кодируется однозначным числом, в данном случае эта функция может оказаться не совсем точной, особенно для оценки промежутков времени меньше 1 секунды. Многие разработчики, кроме того, используют функцию GetTickCount.

Поскольку эта функция привяза­на к часовому таймеру PC, она возвращает время не в миллисекундах, а в приращениях 1/18 секунды. API Windows предлагает таймер, который отслеживает время в миллисекундах. Функция timeGetTimeO изме­ряет промежуток времени с момента запуска Windows. Поскольку она использует другой аппаратный счетчик, то возвращает время с точностью до миллисекунды.

Используя timeGetTime(),

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

Для использования вызова API необходимы две вещи: объявление функции и глобальная переменная для хранения времени запуска таймера. В разделе объявлений модуля необходимо ввести следующие три строки:




Private Declare Function a2ku apigettime Lib "winmm.dll" _

Alias "timeGetTime" () As Long

Dim Ingstartingtime As Long

Затем можно создать подпрограмму для запуска часов и функцию остановки часов.

Sub a2kuStartClock()



Ingstartingtime = a2ku_apigettime()

End Sub

Function a2kuEndClock()

a2kuEndClock = a2ku_apigettime() - Ingstartingtime

End Function

Использование данных функций для оценки производительности запроса иллюстрирует код, приведен­ный в листинге 1.

Листинг 1. Определение времени выполнения запроса.

Sub QueryTimer(strQueryName As String)

Dim db As Database

Dim qry As QueryDef

Dim rs as Recordset

Set db = CurrentDb()

Set qry =

db.QueryDefs(strQueryName)


'Запуск часов. a2kuStartClock

Set rs = qry.OpenRecordset()

'Остановка часов и вывод результата в окне отладки.

Debug.Print strQueryName & " executed in:  " & a2kuEndClock & _

" milliseconds"

rs.Close

End Sub

ПРИМЕЧАНИЕ

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


Содержание раздела