Контроль времени выполнения методов страницы ASP.Net
Кто-нибудь может мне посоветовать, есть ли подходы для расчета времени выполнения методов на странице asp.net?
ASP.Net Trace меня не устраивает, поскольку он игнорирует частичные обратные передачи ajax, хотя они и являются узким местом.
У меня есть событие страницы, которое по неизвестной причине выполняется медленно. Поскольку логика и цепочка выполнения событий довольно сложны, я все еще не могу просто определить виновника в отладчике.
Я хотел бы измерить время выполнения каждого метода по всей странице, но я все еще не вижу способа, кроме как вставить избыточные строки кода (например, timeBegin = DateTime.Now.... timeEnd=DateTime.Now = timeBegin и т. Д.) В начале и окончание каждого метода. Это кажется уродливым подходом, кто-нибудь знает, как это сделать автоматически? Существуют ли инструменты, которые измеряют время выполнения методов?
3 ответа
Я не уверен на 100%, что приведенное ниже работает во всех случаях. Пока что, хотя. Обратите внимание, что Context.Session.Item("CURRENT_WEB_USER") - это место, где я храню текущего пользователя, и, следовательно, недоступно как часть переменных сеанса asp.net.
Код, представленный ниже, заменяет Global.aspx, который обеспечивает как полную синхронизацию страниц, так и синхронизацию кода разработчика.
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
End Sub
Sub Application_End(ByVal sender As Object, ByVal e As EventArgs)
End Sub
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
End Sub
Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
End Sub
Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
End Sub
Sub Application_AcquireRequestState(sender As Object, e As System.EventArgs)
If HttpContext.Current Is Nothing Then Return
If HttpContext.Current.Session Is Nothing Then Return
If TypeOf HttpContext.Current.CurrentHandler Is Page Then
If Not Context.Items.Contains("Request_Start_Time") Then
Dim MyPage As Page = HttpContext.Current.CurrentHandler
AddHandler MyPage.Init, AddressOf PageInitEncountered
AddHandler MyPage.Unload, AddressOf PageUnloadEncountered
Context.Items.Add("Request_Start_Time", DateTime.Now)
Dim User As String = Context.Session.Item("CURRENT_WEB_USER")
Context.Items.Add("Request_User", User )
End If
End If
End Sub
Sub Application_ReleaseRequestState(sender As Object, e As System.EventArgs)
If HttpContext.Current Is Nothing Then Return
If TypeOf Context.CurrentHandler Is Page Then
Dim Page As Page = Context.CurrentHandler
Dim StartDate As Date = Context.Items("Request_Start_Time") : If StartDate = Nothing Then Return
Dim EndDate As Date = Now
Dim StartProc As Date = Context.Items("Page_Init")
Dim EndProc As Date = Context.Items("Page_Unload")
Dim User As String = Context.Items("Request_User")
LogEntry(StartDate, EndDate, StartProc, EndProc, User, Context.Request.Url.ToString)
End If
End Sub
Public Sub PageInitEncountered(sender As Object, e As System.EventArgs)
Context.Items.Add("Page_Init", DateTime.Now)
End Sub
Public Sub PageUnloadEncountered(sender As Object, e As System.EventArgs)
Context.Items.Add("Page_Unload", DateTime.Now)
End Sub
Public Sub LogEntry(StartDate As Date, EndDate As Date, StartProc As Date, EndProc As Date, User As String, PageURL As String)
System.Diagnostics.Debug.WriteLine(" (" & LogEntry.RequestMs & " - " & LogEntry.DurationMs & ") (" & User & ") " & PageURL)
End Sub
Это может быть не то, что вы ищете, но RedGate имеет продукт под названием Performance Profiler, который делает именно это. У них есть 15-дневная пробная версия, так что вы даже можете скачать ее и опробовать в своем текущем выпуске. ИМХО, это стоит каждой копейки.
Вы можете использовать счетчики производительности asp.net и другие вещи. Но это не будет измерять скорость страницы, но будет измерять производительность всего приложения.