2009-04-03 11 views
8

P: Jak obliczyć całkowity czas potrzebny do wyświetlenia strony MVC i wyświetlenia czasu na stronie wzorcowej.Strona Renderuj czas w MVC

w ASP.NET Web Form Stworzyłem klasę strona bazowa tak:

public class PageBase : System.Web.UI.Page 
{  
    private DateTime startTime = DateTime.Now; 
    private TimeSpan renderTime; 
    public DateTime StartTime 
    { 
     set { startTime = value; } 
     get { return startTime; } 
    } 
    public virtual string PageRenderTime 
    { 
     get 
     { 
      renderTime = DateTime.Now - startTime; 
      return renderTime.Seconds + "." + renderTime.Milliseconds + " seconds"; 
     } 
    }  
} 

Chciałbym następnie wywołać metodę na mojej strony wzorcowej tak:

<div id="performance"> 
    <% =PageRenderTime %> 
</div> 

Q: Jak zrobić Osiągam to samo z ramą MVC?

P: W środowisku MVC, gdzie ustawić godzinę rozpoczęcia tworzenia strony?

+1

nie jest to odpowiedź na twoje pytanie, ale przyjrzeć System.Diagnostics.Stopwatch kiedy chcesz obliczyć okresy w ten sposób. Zobacz http://stackoverflow.com/questions/28637/is-datetime-now-the-best-way-to-measure-a-functions-performance –

Odpowiedz

1

Utwórz kontroler podstawowy i wypróbuj z niego kontrolery. Ustaw czas rozpoczęcia w konstruktorze i zastąp funkcję Dispose() i wprowadź obliczenie łącznego czasu. Powinno to doprowadzić do końca w całym okresie działania. Ponieważ kontroler implementuje IDisposable, zakładam, że silnik renderujący wyrzuci go po obliczeniu wyniku i nie będziesz musiał czekać na odśmiecanie. Jeśli moje założenie okaże się błędne, możesz zamiast tego użyć OnResultExecuted().

EDIT: Aby uzyskać czas renderowania na stronie byłby stosunkowo trudne, ponieważ z definicji strona nie można zrobić renderowania, aż czas kładzie się na strony i nie można mieć czas do strony wykonuje renderowanie. Można jednak napisać czas renderowania do sesji, a następnie użyć AJAX, aby wrócić i uzyskać czas renderowania do wyświetlenia później. Możesz go przybliżać, umieszczając czas rozpoczęcia w ViewData i obliczając czas renderowania w samym widoku. Możesz spróbować zarejestrować czas renderowania i zrobić przybliżenie widoku i zobaczyć, jak bliski jest.

Ten kod może zostać wykorzystany do zarejestrowania czasu renderowania.

public class BaseController : Controller 
{ 
    private DateTime StartTime { get; set; } 
    public BaseController() : base() 
    { 
     StartTime = DateTime.Now; 
    } 

    public override void Dispose(bool disposing) 
    { 
     var totalTime = DateTime.Now - this.StartTime; 
     ... write it out somewhere ... 
    } 
} 
2

Prawdopodobnie zastępują OnActionExecuting i OnActionExecuted metody na klasie kontrolera.

public class BaseController : Controller { 
    // Called before the action is executed 
    public override void OnActionExecuting(ActionExecutingContext ctx) { 
     base.OnActionExecuting(ctx); 
     // Start timing 
    } 

    // Called after the action is executed 
    public override void OnActionExecuted(ActionExecutedContext ctx) { 
     base.OnActionExecuted(ctx); 
     // Stop timing 
    } 
} 
+0

Myślę, że da ci to tylko czas na skonfigurowanie danych wynikowych , nie renderuje strony. Dla czasu renderowania, OnResultExecuted, który jest wywoływany po wykonaniu ActionResult, jest dokładniejszy. – tvanfosson

+0

To prawda, ale nie sądzę, że można zmodyfikować ViewData po wykonaniu wyniku, co oznacza, że ​​nie ma możliwości wyświetlenia czasu wykonania na stronie. Popraw mnie, jeśli się mylę. –

+3

Tak. To też byłoby moje zrozumienie. Ale możesz zapisać czas i pobrać go przez AJAX, jeśli potrzebujesz dokładnego pomiaru. Osobiście logowałbym go i nie martwiłbym się o to, by go uzyskać na samej stronie. – tvanfosson

4

Idź do swojego web.config i upewnij się, że masz ...

<system.web> 
    <trace enabled="true" localOnly="false" /> 
</system.web> 

wtedy można goto http://.../trace.axd i zobaczyć każdy wniosek złożony ty.

Następnie należy spojrzeć pod kolumną Od pierwszego (pierwszych), a ostatnim jest czas renderowania strony (po stronie serwera).

Przykład ...

aspx.page End Render 0.06121112 0.005297 

61,2 ms do renderowania strony.

Jeśli szukasz kodu czasowego samodzielnie lub chcesz ręcznie wykonać niektóre czynności diagnostyczne, skorzystaj z klasy System.Diagnostics.Stopwatch, a nie DateTime.

Stopwatch sw = Stopwatch.StartNew(); 
... 
sw.Stop(); 
Trace.Write(sw.ElapsedMilliseconds); 
+0

Dzięki ... Naprawdę chciałbym zobaczyć czas renderowania strony w stopce strony wzorcowej. – TonyAbell

+0

Możesz użyć obiektu Trace i wykonać polecenie Trace.Write(), aby zapisać dane wyjściowe śledzenia i dodać je do listy zdarzeń i czasów renderowania itp. –

+0

Pyta o czas renderowania (wymaganie klienta ?), sugerujesz wyświetlanie wszelkiego rodzaju informacji debugowania, których może nie chcieć zobaczyć. – GvS

Powiązane problemy