Продолжительность отслеживания вызовов функций в vb.net - PullRequest
5 голосов
/ 15 февраля 2012

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

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

Ответы [ 4 ]

7 голосов
/ 15 февраля 2012

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

  '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, чтобы получить время непосредственно в миллисекундах или в других форматах.

3 голосов
/ 15 февраля 2012

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

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

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

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

2 голосов
/ 02 октября 2012

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

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

Полный список инструментов и методов см. В http://msdn.microsoft.com/en-us/magazine/hh288073.aspx.

.
0 голосов
/ 30 марта 2017

Я часто использую этот вспомогательный класс.Он в основном делает то, что предложил @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)
...