ViewContext.HttpContext.Timestamp thing suggested by Marnix is ββsmart, I did not understand what it was. However, you can also do this as an HttpModule, which will also work in an application other than MVC:
using System; using System.Web; namespace MyLibrary { public class PerformanceMonitorModule : IHttpModule { public void Dispose() { } public void Init(HttpApplication context) { context.PreSendRequestContent += delegate(object sender, EventArgs e) { HttpContext httpContext = ((HttpApplication)sender).Context; if (httpContext.Response.ContentType == "text/html") { DateTime timestamp = httpContext.Timestamp; double seconds = (double)DateTime.Now.Subtract(timestamp).Ticks / (double)TimeSpan.TicksPerSecond; string result = String.Format("{0:F4} seconds ({1:F0} req/sec)", seconds, 1 / seconds); httpContext.Response.Write("<div style=\"position: fixed; right: 5px; bottom: 5px; font-size: 15px; font-weight: bold;\">Page Execution Time: " + result + "</div>"); } }; } } }
Then put this in your web.config:
<httpModules> <add name="PerformanceMonitor" type="MyLibrary.PerformanceMonitorModule, MyLibrary"/> </httpModules>
This will record the time at the very last moment when it will be delivered before the HTML content is sent to the browser so that it measures the HTTP pipeline as much as possible. Not sure if you can stick ViewContext.HttpContext.Timestamp in your page layout?
Note: this will not lead to valid HTML markup because it overlays a <div> on the bottom of the page, therefore it is used only for development / performance analysis.
EDIT : I modified the HttpModule to use HttpContext.Timestamp instead of storing the stopwatch object in the request context, as it seems to give more accurate results.
Sunday ironfoot
source share