forked from MiniProfiler/miniprofiler.github.com
-
Notifications
You must be signed in to change notification settings - Fork 0
/
params.json
1 lines (1 loc) · 7.89 KB
/
params.json
1
{"name":"MiniProfiler","body":"A simple but effective mini-profiler for ASP.NET MVC and ASP.NET.\r\n\r\nOfficial Repo: https://github.com/SamSaffron/MiniProfiler\r\n\r\n*IMPORTANT* for the 2.0 release the namespace for Mini Profiler is changing. Instead of `using MvcMiniProfiler` use `using StackExchange.Profiling`\r\n\r\n### What does it profile?\r\n\r\nMiniProfiler does **not** attach itself to every single method call; that would be too invasive and wouldn't focus on the biggest performance issues. Instead, it provides:\r\n\r\n- An ADO.NET profiler, capable of profiling calls on raw ADO.NET (SQL Server, Oracle, etc), LINQ-to-SQL, EF / \"Code First\", [Lightspeed](http://www.mindscapehq.com/blog/index.php/2011/07/28/using-the-asp-net-mvc-mini-profiler-with-lightspeed/) and a range of other data access scenarios\r\n- A pragmatic `Step` instrumentation that you can add to code you want to explicitly profile\r\n\r\nSimple. Fast. Pragmatic. Useful.\r\n\r\n### What is included? \r\n\r\nA single assembly, with an example ASP.NET and ASP.NET MVC project to show usage.\r\n\r\n## Getting Started \r\n\r\nWrite out our css and javascript includes just before closing the body tag:\r\n\r\n @using StackExchange.Profiling;\r\n <head>\r\n ..\r\n </head>\r\n <body>\r\n ...\r\n @MiniProfiler.RenderIncludes()\r\n </body>\r\n\r\nFor requests that aren't being profiled, nothing will be written.\r\n\r\n- Decide when you want to profile; perhaps for local requests, perhaps for special users (developers, admins, test team, whatever).\r\n\r\nThe sample project starts profiling in `Global.asax.cs` `Application_BeginRequest`:\r\n\r\n\r\n using StackExchange.Profiling;\r\n ... \r\n protected void Application_BeginRequest()\r\n {\r\n if (Request.IsLocal)\r\n {\r\n MiniProfiler.Start();\r\n } \r\n }\r\n\r\n\r\nFor the code you want to profile, use (regardless of whether the `profiler` is `null` or not):\r\n\r\n using StackExchange.Profiling;\r\n ...\r\n var profiler = MiniProfiler.Current; // it's ok if this is null\r\n using (profiler.Step(\"Set page title\"))\r\n {\r\n ViewBag.Title = \"Home Page\";\r\n }\r\n using (profiler.Step(\"Doing complex stuff\"))\r\n {\r\n using (profiler.Step(\"Step A\"))\r\n { // something more interesting here\r\n Thread.Sleep(100);\r\n }\r\n using (profiler.Step(\"Step B\"))\r\n { // and here\r\n Thread.Sleep(250);\r\n }\r\n }\r\n\r\nYou can make this as granular or high-level as you like; passing a `MiniProfiler` in as an optional argument (defaulting to `null`) to downstream methods works well.\r\n\r\nStop the profiler; the sample project does this in its `Global.asax.cs`:\r\n\r\n protected void Application_EndRequest()\r\n {\r\n MiniProfiler.Stop();\r\n }\r\n\r\nIf all goes well, you'll see something like this:\r\n\r\n![demo](http://i.imgur.com/PsjLY.png)\r\n\r\n\r\n###Database profiling \r\n\r\nThe profiler includes powerful and comprehensive database profiling capabilities. To enable wrap your database connection with a profiling connection. \r\n\r\nThe built in database profiler support any kind of DbConnection. It also supports Entity Framework and Linq-2-SQL. \r\n\r\nUsage: \r\n\r\nUse a factory to return your connection: \r\n\r\n\r\n public static DbConnection GetOpenConnection()\r\n {\r\n var cnn = CreateRealConnection(); // A SqlConnection, SqliteConnection ... or whatever\r\n \r\n // wrap the connection with a profiling connection that tracks timings \r\n return new MvcMiniProfiler.Data.ProfiledDbConnection(cnn, MiniProfiler.Current);\r\n }\r\n\r\n\r\n###Entity Framework\r\n\r\n\r\n public static MyModel Get()\r\n {\r\n var conn = new MvcMiniProfiler.Data.EFProfiledDbConnection(GetConnection(), MiniProfiler.Current);\r\n return ObjectContextUtils.CreateObjectContext<MyModel>(conn); // resides in the MiniProfiler.EF nuget pack\r\n }\r\n\r\n\r\n###LINQ-2-SQL\r\n\r\n\r\n partial class DBContext\r\n {\r\n public static DBContext Get()\r\n {\r\n var conn = new MvcMiniProfiler.Data.ProfiledDbConnection(GetConnection(), MiniProfiler.Current);\r\n return new DBContext(conn);\r\n }\r\n }\r\n\r\n###Entity Framework - Code First\r\n\r\nMVC Mini Profiler can be hooked in to an EF code first project. To do so: \r\n\r\nInstall the Nuget MiniProfiler.EF package: \r\n\r\nRun: `MiniProfilerEF.Initialize(); // in Application_Start`\r\n\r\nThat's it ... you are done!\r\n\r\nNote: EF Code First will store table metadata in a table called: !EdmMetadata. This metadata uses the provider as part of the entity key. If you initialized your provider as a non-profiled provider, you will have to re-build this metadata. Deleting all the rows from !EdmMetadata may do the trick, alternatively some smarter providers are able to handle this transparently. \r\n\r\n**EF 4.1 Update 1**\r\n\r\nNote, that EF 4.1 Update 1 (the version currently on NuGet) has a breaking change which throws the following error when specifying a connection string:\r\n\r\n`The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)`\r\n\r\nMiniProfiler attempts to resolve this issue by detecting the version of Entity Framework that it is running against. If this doesn't work (due to security exceptions), force the hack to be applied by replacing the `Initialize()` call with: \r\n\r\n`MiniProfilerEF.Initialize_EF42(); // in Application_Start`\r\n\r\nHowever, this is currently unable to profile SqlCE or Oracle databases. \r\n\r\nTo work around this an additional parameter has been added to the `Initialize` call:\r\n\r\n- If you specify connection strings explicitly in your `web.config`, use `MiniProfilerEF.Initialize();`. This will not profile SqlCE or Oracle databases\r\n- If you don't specify connection strings (automatically inferred) and want SqlCE support, use `MiniProfilerEF.Initialize(false);`.\r\n\r\nNote, this should be a temporary solution until EF 4.2 is widely available.\r\n\r\n##Various features\r\n\r\n###(N+1) and duplicate query detection===\r\n\r\nThe profiler is able to detect and highlight areas where you are executing the same query multiple times with different parameters. This allows you to quickly find queries you may be able to batch. \r\n\r\n![N+1](http://i.stack.imgur.com/0P0pr.png)\r\n\r\n###What about AJAX?\r\n\r\nThe profiler is also able to log all ajax calls: \r\n\r\n![ajax calls](http://i.stack.imgur.com/3k2NN.png)\r\n\r\nYou will get one profile timing per ajax call. \r\n\r\n###Abandoning a profiler session\r\n\r\nOften at the beginning of a session you may not know if a user should or should not be allowed to profile, a common pattern for dealing with such issues is:\r\n\r\n protected void Application_BeginRequest()\r\n {\r\n MvcMiniProfiler.MiniProfiler.Start(); \r\n }\r\n protected void Application_AuthenticateRequest(Object sender, EventArgs e)\r\n {\r\n if(!CurrentUserIsAllowedToSeeProfiler())\r\n {\r\n MvcMiniProfiler.MiniProfiler.Stop(discardResults: true);\r\n }\r\n }\r\n\r\n \r\n\r\n###Where is MiniProfiler used?\r\n\r\nMiniProfiler was designed by the team at [Stack Overflow](http://stackoverflow.com). It is in production use there and on the [Stack Exchange](http://stackexchange.com) family of sites. \r\n\r\nAlso used at: \r\n\r\n- https://acturent.com\r\n- http://jobseriously.com\r\n- http://www.plane9.com\r\n\r\n(if you are using this in production please let us know and we will add you to the list)\r\n\r\n###Frequently Asked Questions\r\n\r\nIf you have other questions, please visit [Stack Overflow](http://stackoverflow.com/questions/tagged/mini-profiler?sort=faq&pagesize=50).\r\n","tagline":"A simple but effective mini-profiler for ASP.NET MVC and ASP.NET.","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."}