diff --git a/src/Umbraco.Core/Profiling/ProfilingView.cs b/src/Umbraco.Core/Profiling/ProfilingView.cs
new file mode 100644
index 0000000000..110ab14925
--- /dev/null
+++ b/src/Umbraco.Core/Profiling/ProfilingView.cs
@@ -0,0 +1,28 @@
+using System.IO;
+using System.Web.Mvc;
+
+namespace Umbraco.Core.Profiling
+{
+ public class ProfilingView : IView
+ {
+ private readonly IView _inner;
+ private readonly string _name;
+ private readonly string _viewPath;
+
+ public ProfilingView(IView inner)
+ {
+ _inner = inner;
+ _name = inner.GetType().Name;
+ var razorView = inner as RazorView;
+ _viewPath = razorView != null ? razorView.ViewPath : "Unknown";
+ }
+
+ public void Render(ViewContext viewContext, TextWriter writer)
+ {
+ using (ProfilerResolver.Current.Profiler.Step(string.Format("{0}.Render: {1}", _name, _viewPath)))
+ {
+ _inner.Render(viewContext, writer);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Profiling/ProfilingViewEngine.cs b/src/Umbraco.Core/Profiling/ProfilingViewEngine.cs
new file mode 100644
index 0000000000..5df2b6f811
--- /dev/null
+++ b/src/Umbraco.Core/Profiling/ProfilingViewEngine.cs
@@ -0,0 +1,48 @@
+using System.Web.Mvc;
+
+namespace Umbraco.Core.Profiling
+{
+ public class ProfilingViewEngine: IViewEngine
+ {
+ private readonly IViewEngine _inner;
+ private readonly string _name;
+
+ public ProfilingViewEngine(IViewEngine inner)
+ {
+ _inner = inner;
+ _name = inner.GetType().Name;
+ }
+
+ public ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
+ {
+ using (ProfilerResolver.Current.Profiler.Step(string.Format("{0}.FindPartialView, {1}, {2}", _name, partialViewName, useCache)))
+ {
+ return WrapResult(_inner.FindPartialView(controllerContext, partialViewName, useCache));
+ }
+ }
+
+ public ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
+ {
+ using (ProfilerResolver.Current.Profiler.Step(string.Format("{0}.FindView, {1}, {2}, {3}", _name, viewName, masterName, useCache)))
+ {
+ return WrapResult(_inner.FindView(controllerContext, viewName, masterName, useCache));
+ }
+ }
+
+ private static ViewEngineResult WrapResult(ViewEngineResult innerResult)
+ {
+ var profiledResult = innerResult.View != null ?
+ new ViewEngineResult(new ProfilingView(innerResult.View), innerResult.ViewEngine) :
+ new ViewEngineResult(innerResult.SearchedLocations);
+ return profiledResult;
+ }
+
+ public void ReleaseView(ControllerContext controllerContext, IView view)
+ {
+ using (ProfilerResolver.Current.Profiler.Step(string.Format("{0}.ReleaseView, {1}", _name, view.GetType().Name)))
+ {
+ _inner.ReleaseView(controllerContext, view);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj
index dc95d29ab4..1386f52e2a 100644
--- a/src/Umbraco.Core/Umbraco.Core.csproj
+++ b/src/Umbraco.Core/Umbraco.Core.csproj
@@ -562,6 +562,8 @@
+
+
diff --git a/src/Umbraco.Web/WebBootManager.cs b/src/Umbraco.Web/WebBootManager.cs
index 35869fb76b..cca270acd3 100644
--- a/src/Umbraco.Web/WebBootManager.cs
+++ b/src/Umbraco.Web/WebBootManager.cs
@@ -9,7 +9,6 @@ using StackExchange.Profiling.MVCHelpers;
using Umbraco.Core;
using Umbraco.Core.Configuration;
using Umbraco.Core.Dictionary;
-using Umbraco.Core.Dynamics;
using Umbraco.Core.Logging;
using Umbraco.Core.ObjectResolution;
using Umbraco.Core.Profiling;
@@ -25,9 +24,8 @@ using Umbraco.Web.PublishedCache;
using Umbraco.Web.Routing;
using Umbraco.Web.WebApi;
using umbraco.BusinessLogic;
-using umbraco.businesslogic;
-using umbraco.cms.businesslogic;
using umbraco.presentation.cache;
+using ProfilingViewEngine = Umbraco.Core.Profiling.ProfilingViewEngine;
namespace Umbraco.Web
@@ -73,9 +71,9 @@ namespace Umbraco.Web
new MasterControllerFactory(FilteredControllerFactoriesResolver.Current));
//set the render view engine
- ViewEngines.Engines.Add(new ProfilingViewEngine(new RenderViewEngine()));
+ ViewEngines.Engines.Add(new RenderViewEngine());
//set the plugin view engine
- ViewEngines.Engines.Add(new ProfilingViewEngine(new PluginViewEngine()));
+ ViewEngines.Engines.Add(new PluginViewEngine());
//set model binder
ModelBinders.Binders.Add(new KeyValuePair(typeof(RenderModel), new RenderModelBinder()));
@@ -129,7 +127,15 @@ namespace Umbraco.Web
///
public override IBootManager Complete(Action afterComplete)
{
- //set routes
+ //Wrap viewengines in the profiling engine
+ IViewEngine[] engines = ViewEngines.Engines.Select(e => e).ToArray();
+ ViewEngines.Engines.Clear();
+ foreach (var engine in engines)
+ {
+ ViewEngines.Engines.Add(new ProfilingViewEngine(engine));
+ }
+
+ //set routes
CreateRoutes();
base.Complete(afterComplete);