ASP.NET MVC мини профайлер
Команда StackOveflow разработала небольшой, но весьма полезный профайлер для ASP.NET MVC 3. Основа проекта - единственная библиотека, также можно скачать демо MVC проект.
Начинаем работу
Для начала необходимо добавить CSS и JavaScript в master page / layout после объявления jQuery:
<head> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script> @MvcMiniProfiler.MiniProfiler.RenderIncludes() </head>
Дальше необходиом решить, какую информацию вы хотите отслеживать - локальные запросы или что-то другое.
В тестовом примере профайлер стартует в файле Global.asax.cs (метод Application_BeginRequest) и отслеживает локальные запросы:
using MvcMiniProfiler; ... protected void Application_BeginRequest() { if (Request.IsLocal) { MiniProfiler.Start(); } }
Если вы хотите исследовать некий код с помощью профайлера, используете следующий код:
using MvcMiniProfiler; ... var profiler = MiniProfiler.Current; // it's ok if this is null using (profiler.Step("Set page title")) { ViewBag.Title = "Home Page"; } using (profiler.Step("Doing complex stuff")) { using (profiler.Step("Step A")) { // something more interesting here Thread.Sleep(100); } using (profiler.Step("Step B")) { // and here Thread.Sleep(250); } }
Вы можете использовать этот код как локально, так и на высоких уровнях (и можете, например, передавать экземпляр класса MiniProfiler как необязательный параметр (со значением по умолчанию null) вниз по иерархии классов / методов).
Для остановк профайлера используйте метод Stop():
protected void Application_EndRequest() { MiniProfiler.Stop(); }
Если все было сделано правильно, то вы должны увидеть похожий результат:
Профилирование базы данных
Профайлер содержит мощные средства для профилирования баз данных. Для этоо вам необходимо обернуть ваше соединение с базой с помощью соединения профилировщика.
Профилировщик поддерживает любой тип DbConnection, а также Entity Framework и Linq to SQL.
Пример использования:
public static DbConnection GetOpenConnection() { var cnn = CreateRealConnection(); // A SqlConnection, SqliteConnection ... or whatever // wrap the connection with a profiling connection that tracks timings return new MvcMiniProfiler.Data.ProfiledDbConnection.Get(cnn, MiniProfiler.Current); }
Entity Framework:
public static MyModel Get() { var conn = ProfiledDbConnection.Get(GetConnection()); return ObjectContextUtils.CreateObjectContext<MyModel>(conn); }
LINQ to SQL:
partial class DBContext { public static DBContext Get() { var conn = ProfiledDbConnection.Get(GetConnection()); return new DBContext(conn); // or: return DataContextUtils.CreateDataContext<DBContext>(conn); } }
Другие возможности
Определение (N+1) и дублирующихся запросов
Профайлер позволяет определять и выделять те области, которые выполняют одинаковые запросы несколько раз с разными параметрами.
А как насчет AJAX?
Профайлер позволяет исследовать ajax запросы:
Работа с профайлером
Часто в начале сесии вы не знаете, должен ли текущий пользователь видеть информацию о профилировании. Для решения этой проблемы используется такой подход:
protected void Application_BeginRequest() { MvcMiniProfiler.MiniProfiler.Start(); } protected void Application_AuthenticateRequest(Object sender, EventArgs e) { if(!CurrentUserIsAllowedToSeeProfiler()) { MvcMiniProfiler.MiniProfiler.Stop(discardResults: true); } }
С часто задаваемыми вопросами можно ознакомиться по ссылке.
http://code.google.com/p/mvc-mini-profiler/