4

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

В основном, как это работает, были две служебные функции: StartTickCount() и EndTickCount(). Вы передавали бы имя функции в каждом, и функции использовали бы словарь для получения количества тиков при вызове StartTickCount(), а затем вычитали количество тиков при вызове EndTickCount(). Это не было совершенным, потому что это, конечно, не учитывало, что призывы к подсчету отсчетов требуют времени и т. Д., Но в основном это сработало для наших целей. Боль в стыковой части было убедиться, назвать StartTickCount() в начале каждой функции и EndTickCount() в каждой точке выхода:

Private Function SomeFuction() as String 
    ' indicate the function started 
    StartTickCount("MyClass.SomeFunction") 


    ' some logic that causes the function to end 
    If (some logic) Then 
     EndTickCount("MyClass.SomeFunction") 
     Return "Hello!" 
    End If 

    ' final exit point 
    EndTickCount("MyClass.SomeFunction") 
    Return "World" 
End Function 

Во всяком случае, есть ли функциональность встроенной, либо через VS 2010 отладчиком или в пространстве имен System.Reflection, чтобы сделать что-то подобное в VB.NET?

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

Я могу, конечно, написать это вручную (поскольку мы уже делали это раз в VB6), но если есть существующие инструменты, чтобы упростить их, я бы предпочел использовать их.

+0

Рассматривали ли вы с помощью профилировщик? –

+0

Похоже, что профайлер будет работать, по крайней мере, при работе в режиме отладки. Но нам также может потребоваться проверить производительность на сервере клиентов (у которого не было бы инструментов VS2010), так же есть ли какие-либо варианты кодирования? –

ответ

3

Я бы посмотрел на класс секундомера - он предназначен для такого типа вещей.

Однако есть еще и фантастический инструмент, чтобы сделать это уже, и на самом деле он делает лучшую работу с очень маленькой работой. У него также есть 10-дневная бесплатная пробная версия.

http://www.jetbrains.com/profiler/

(я не работаю, и я не связан с JetBrains - но я хотел бы я был потому, что они делают некоторые действительно прохладные продукты)

+1

URL-адрес MSDN для класса секундомера: https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch%28v=vs.100%29.aspx. –

6

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

'Create a variable for start time: 
    Dim TimerStart As DateTime 
    TimerStart = Now 
' 
'place your computing here 
' 
    Dim TimeSpent As System.TimeSpan 
    TimeSpent = Now.Subtract(TimerStart) 
    MsgBox(TimeSpent.TotalSeconds & " seconds spent on this task") 

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

2

Похоже, вам нужно добавить некоторые профилирование в ваше приложение. Вы можете начать с beginner's guide to profiling with VS.

Вы также можете добавить счетчики производительности в приложение для показателей времени выполнения. См. http://msdn.microsoft.com/en-us/library/w8f5kw2e(v=vs.100).aspx.

Для получения более полного списка инструментов и методов см. http://msdn.microsoft.com/en-us/magazine/hh288073.aspx.

0

Я пользуюсь этим вспомогательным классом.Она делает то, что предложил @AndreaAntonangeli, но устроен так, чтобы иметь более чистый код:

Public Class TimeSpanHelper 

    Dim caller_name As String 
    Dim timer_start As DateTime 
    Dim time_spent As System.TimeSpan 
    Dim prev_time As DateTime 
    Dim time_diff As System.TimeSpan 

    Public Sub New(caller As String) 
     caller_name = caller 
    End Sub 

    Public Sub startClock() 
     timer_start = DateTime.Now 
     Console.WriteLine(caller_name & " starts at:" & timer_start.ToString) 
     prev_time = timer_start 
    End Sub 

    Public Sub getElapsedTime(Optional flag As String = "") 
     time_spent = Now.Subtract(timer_start) 
     time_diff = Now.Subtract(prev_time) 
     prev_time = DateTime.Now 
     Console.WriteLine(caller_name & "-" & flag & " " & time_spent.TotalSeconds & "s from start (" & time_diff.TotalSeconds & "s from previous flag)") 
    End Sub 

    Public Sub stopClock() 
     Dim timer_stop As DateTime = DateTime.Now 
     time_spent = Now.Subtract(timer_start) 
     time_diff = Now.Subtract(prev_time) 
     Console.WriteLine(caller_name & " ends at:" & timer_stop.ToString & " - " & time_spent.TotalSeconds & " seconds elapsed from start (" & time_diff.TotalSeconds & "s from previous flag)") 
    End Sub 

End Class 

Пример использования:

'Put this wherever you want to start to count 
Dim timer As TimeSpanHelper = New TimeSpanHelper("MyFunctionName") 
timer.startClock() 
'Do something ... 
timer.getElapsedTime("flag1") 
'Do something ... 
timer.getElapsedTime("flag2") 
'Do something ... 
timer.stopClock() 

Ваш результат должен быть что-то вроде:

MyFunctionName starts at 30/03/2017 16:57:21 
MyFunctionName - flag1 Xs from start (Xs from previous flag) 
MyFunctionName - flag2 Xs from start (Xs from previous flag) 
MyFunctionName ends at 30/03/2017 16:59:14 - 120s elapsed from start (Xs from previous flag) 
Смежные вопросы