Средства оценки производительности
Разработчику важно знать, какое же влияние оказали на приложение все предпринятые усилия. Для отслеживания и оценки относительной производительности, достигнутой с помощью той или иной методики, можно использовать несколько разных инструментальных средств. Первый способ — это таймер для измерения количества времени, которое занимает выполнение процесса. Второй способ — недокументированная функция для подсчета операций с диском, кэшем и операций блокировки. Третий способ — способность 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 как можно ближе к местонахождению рассматриваемой процедуры.