Время отображения страницы в MVC - PullRequest
8 голосов
/ 03 апреля 2009

В: Как рассчитать общее время, необходимое для отображения страницы MVC и отображения времени на главной странице.

В веб-форме Asp.net я создал класс базовой страницы примерно так:

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";
        }
    }       
}

Затем я бы вызвал метод на моей мастер-странице следующим образом:

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

В: Как мне сделать то же самое с MVC Framework?

В: С платформой MVC где я могу установить время начала, когда страница создается впервые?

Ответы [ 4 ]

11 голосов
/ 19 ноября 2010

Лучший способ сделать это - рассчитать время запроса. Начать запрос и завершить запрос .... Проверьте этот великий пост:

http://haacked.com/archive/2008/07/02/httpmodule-for-timing-requests.aspx

4 голосов
/ 03 апреля 2009

Зайдите в ваш web.config и убедитесь, что у вас есть ...

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

Затем вы можете перейти на http: //.../trace.axd и просмотреть каждый сделанный запрос.

Затем вы хотите заглянуть в столбец From First (s), и самый последний - это время, которое потребовалось для отображения страницы (на стороне сервера).

Пример ...

aspx.page   End Render  0.06121112  0.005297

61,2 мс для отображения страницы.

Если вам нужен сам временной код или вы хотите выполнить некоторые диагностические операции вручную, вы хотите использовать класс System.Diagnostics.Stopwatch, а не DateTime.

Stopwatch sw = Stopwatch.StartNew();
...
sw.Stop();
Trace.Write(sw.ElapsedMilliseconds);
2 голосов
/ 03 апреля 2009

Я бы, вероятно, переопределил методы OnActionExecuting и OnActionExecuted в классе Controller.

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
    }
}
1 голос
/ 03 апреля 2009

Создайте базовый контроллер и получайте от него ваши контроллеры. Установите время начала в конструкторе и переопределите Dispose () и поместите в него вычисление общего времени. Это должно дать вам сквозной на всю жизнь действия. Поскольку Controller реализует IDisposable, я предполагаю, что механизм рендеринга утилизирует его после вычисления результата, и вам не придется ждать сборки мусора. Если мое предположение окажется неверным, вы можете вместо этого использовать OnResultExecuted ().

РЕДАКТИРОВАТЬ : Получить время рендеринга на странице было бы относительно сложно, потому что по определению невозможно выполнить рендеринг страницы, пока на странице не будет указано ваше время и у вас не будет времени пока страница не закончена рендеринг. Однако вы можете записать время рендеринга в сеанс, а затем использовать AJAX, чтобы вернуться и получить время рендеринга для отображения позже. Вы можете приблизить его, указав время начала в ViewData и рассчитав время рендеринга в самом View. Возможно, вы захотите записать время рендеринга и приблизительное представление и посмотреть, насколько оно близко.

Этот код можно использовать для регистрации времени рендеринга.

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 ...
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...