Какой лучший способ функций синхронизации / измерения производительности в VB6?

Если я просто хочу быстро измерить, сколько времени занимает конкретная функция, как я могу позвонить, чтобы узнать точное время? Учитывая, что функции синхронизации VB6 не обладают высокой точностью, можно ли вместо этого вызывать функции Windows API?

Какими еще способами вы измеряете производительность приложений? Есть ли какие-либо сторонние инструменты, которые вы рекомендуете?


person Gavin    schedule 20.04.2009    source источник


Ответы (3)


Я обычно использую счетчики производительности Windows с высоким разрешением. Ознакомьтесь с QueryPerformanceCounter и QueryPerfomanceFrequency

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

Инструменты можно найти на сайте devpartner. Хотя он работает хорошо, инструментальная обработка значительных частей кода делает мое приложение невыносимо медленным. Я обычно считаю, что хочу получить точное время только для одной или двух функций, поэтому часто заканчиваю тем, что использую функции счетчика производительности, а не devpartner.

person Stephen Nutt    schedule 20.04.2009
comment
Есть ли шанс, что вы могли бы опубликовать код VB6 с помощью QPC? Мне любопытно, как вы подойдете к объявлению и использованию LARGE_INTEGER. Я не парень из VB. - person John Dibling; 20.04.2009
comment
Ссылка на devpartner не работает. Интересно, отказалась ли компания от продукта? - person TheCrazyProgrammer; 12.01.2016
comment
В новую версию VisualStudio теперь встроены инструменты анализа производительности. DevPartner Studio теперь может принадлежать Borland? borland.com/en-GB/Products/ Тестирование ПО / Автоматизированное тестирование / - person Stephen Nutt; 19.01.2016

Я использую высокопроизводительные мультимедийные таймеры. Вот фрагмент библиотеки профилирования отладки.

Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Private Declare Function timeBeginPeriod Lib "winmm.dll" (ByVal uPeriod As Long) As Long
Private Declare Function timeEndPeriod Lib "winmm.dll" (ByVal uPeriod As Long) As Long

Private mlTimeStarted As Long


Public Sub StartTimer(Optional lPeriod As Long = 1)
10        Call timeBeginPeriod(lPeriod)
20        mlTimeStarted = timeGetTime()
End Sub

Public Function GetTimeElapsed() As Long
10        GetTimeElapsed = timeGetTime() - mlTimeStarted
End Function

Public Sub EndTimer(Optional lPeriod As Long = 1)
    Debug.Assert lPeriod < 10
10        Call timeEndPeriod(lPeriod)
20        mlTimeStarted = 0
End Sub

Public Sub DebugProfileStop()
10        Call EndTimer
End Sub

Public Sub DebugProfileReset()

10        If mlTimeStarted > 0 Then
20            EndTimer
30        End If
40        Call StartTimer

End Sub

Public Sub DebugProfile(sText As String)
10        Debug.Print "Debug " & sText & " : " & CStr(GetTimeElapsed)
End Sub

Использование:

   DebugProfileReset
   DebugProfile("Before Loop")
   For index = 0 to 10000
       DebugProfile("Before Call To Foo")
       Foo
       DebugProfile("Before Call To Bar")
       Bar
       DebugProfile("Before Call To Baz")
       Baz
   Next index
   DebugProfile("After Loop")
   DebugProfileStop
person Kris Erickson    schedule 20.04.2009
comment
Хм, действительно интересно. Выглядит даже немного проще, чем использование QueryPerformanceCounter, хотя я уже реализовал решение таким образом. Спасибо. - person Gavin; 21.04.2009
comment
Я также использую этот метод для определения времени. Просто и хорошо работает. - person Joe; 21.04.2009

VB Watch - еще один инструмент, который вам, возможно, стоит рассмотреть.

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

person Bob    schedule 20.04.2009