From 9ec30860b0632fb54fd834dc61cc6b7a99b576e6 Mon Sep 17 00:00:00 2001 From: mortenbock Date: Wed, 2 Oct 2013 17:48:44 +0200 Subject: [PATCH 1/6] Wrap all ViewEngines in a profiler Wrap all ViewEngines in a custom profiler view engine, using the ProfilerResolver to track performance --- src/Umbraco.Core/Profiling/ProfilingView.cs | 28 +++++++++++ .../Profiling/ProfilingViewEngine.cs | 48 +++++++++++++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 2 + src/Umbraco.Web/WebBootManager.cs | 18 ++++--- 4 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 src/Umbraco.Core/Profiling/ProfilingView.cs create mode 100644 src/Umbraco.Core/Profiling/ProfilingViewEngine.cs 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); From 24020cfea35bd1592fd68a28fb89ee9243a94e2d Mon Sep 17 00:00:00 2001 From: mortenbock Date: Wed, 2 Oct 2013 18:30:59 +0200 Subject: [PATCH 2/6] Make sure the profilingengine doesn't wrap itself --- src/Umbraco.Web/WebBootManager.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web/WebBootManager.cs b/src/Umbraco.Web/WebBootManager.cs index cca270acd3..4c9757fe95 100644 --- a/src/Umbraco.Web/WebBootManager.cs +++ b/src/Umbraco.Web/WebBootManager.cs @@ -132,7 +132,8 @@ namespace Umbraco.Web ViewEngines.Engines.Clear(); foreach (var engine in engines) { - ViewEngines.Engines.Add(new ProfilingViewEngine(engine)); + var wrappedEngine = engine is ProfilingViewEngine ? engine : new ProfilingViewEngine(engine); + ViewEngines.Engines.Add(wrappedEngine); } //set routes From 55247fe31dac59ce7f2aa9adf1d39fb900a90564 Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 3 Oct 2013 12:45:40 +1000 Subject: [PATCH 3/6] Finally got around to changing all calls to umbraco.IO to Umbraco.Core.IO - that'll clear up several hundreds of warnings :) --- src/Umbraco.Tests/BusinessLogic/BaseTest.cs | 2 +- .../Routing/UmbracoModuleTests.cs | 2 +- src/Umbraco.Web.UI/install/steps/theend.ascx | 4 +-- src/Umbraco.Web.UI/umbraco/Default.aspx | 2 +- .../umbraco/Search/QuickSearch.ascx | 2 +- .../GenericProperties/GenericProperty.ascx | 4 +-- .../umbraco/controls/ProgressBar.ascx | 2 +- .../umbraco/controls/Tree/TreeControl.ascx | 4 +-- .../umbraco/developer/Xslt/editXslt.aspx | 2 +- .../umbraco/dialogs/ChangeDocType.aspx | 2 +- .../umbraco/plugins/uGoLive/Dashboard.ascx | 2 +- .../umbraco/settings/editTemplate.aspx | 4 +-- src/Umbraco.Web.UI/umbraco/umbraco.aspx | 4 +-- .../FileExtensionIconThumbnailProvider.cs | 2 +- .../ImageThumbnailProvider.cs | 2 +- .../MediaTypeIconThumbnailProvider.cs | 2 +- src/Umbraco.Web/UI/Controls/FolderBrowser.cs | 2 +- src/Umbraco.Web/UmbracoContext.cs | 2 +- .../umbraco.presentation/LegacyClasses.cs | 2 +- .../umbraco.presentation/NotFoundHandlers.cs | 2 +- .../UmbracoServerUtility.cs | 2 +- .../steps/Definitions/LegacyClasses.cs | 12 +++---- .../install/steps/LegacyClasses.cs | 18 +++++------ .../umbraco.presentation/library.cs | 4 +-- .../umbraco.presentation/python.cs | 2 +- .../umbraco.presentation/requestModule.cs | 2 +- .../umbraco.presentation/template.cs | 2 +- .../Controls/LiveEditingToolbar.cs | 2 +- .../Modules/CreateModule/CreateModule.cs | 2 +- .../Modules/DeleteModule/DeleteModule.cs | 2 +- .../Modules/MacroModule/MacroModule.cs | 2 +- .../Modules/SkinModule/ImageUploader.aspx.cs | 11 ++++--- .../Modules/SkinModule/SkinCustomizer.ascx.cs | 4 +-- .../Modules/SkinModule/SkinModule.cs | 2 +- .../UnpublishModule/UnpublishModule.cs | 2 +- .../umbraco/Trees/TreeService.cs | 2 +- .../umbraco/Trees/XmlTree.cs | 2 +- .../umbraco/Trees/loadDLRScripts.cs | 2 +- .../umbraco/Trees/loadPython.cs | 2 +- .../umbraco/Trees/loadScripts.cs | 2 +- .../umbraco/Trees/loadTemplates.cs | 7 +++-- .../umbraco/Trees/loadXslt.cs | 2 +- .../umbraco/actions/preview.aspx.cs | 4 +-- .../umbraco/channels/UmbracoMetaWeblogAPI.cs | 2 +- .../umbraco/channels/config.cs | 2 +- .../umbraco/controls/ContentTypeControl.cs | 2 +- .../GenericProperties/GenericProperty.ascx | 4 +-- .../GenericPropertyWrapper.cs | 2 +- .../Images/ImageViewerUpdater.asmx.cs | 2 +- .../umbraco/controls/ProgressBar.ascx | 2 +- .../umbraco/controls/SaveClickEventArgs.cs | 2 +- .../controls/Tree/CustomTreeControl.cs | 2 +- .../umbraco/controls/Tree/TreeControl.ascx | 4 +-- .../umbraco/controls/macroParameterControl.cs | 2 +- .../umbraco/create/CreatedPackageTasks.cs | 2 +- .../umbraco/create/DLRScripting.ascx.cs | 5 +-- .../umbraco/create/DLRScriptingTasks.cs | 4 +-- .../umbraco/create/DataTypeTasks.cs | 2 +- .../umbraco/create/MediaTypeTasks.cs | 2 +- .../umbraco/create/MemberGroupTasks.cs | 2 +- .../umbraco/create/MemberTypeTasks.cs | 2 +- .../umbraco/create/NewMemberUIEventArgs.cs | 2 +- .../umbraco/create/PythonTasks.cs | 2 +- .../umbraco/create/ScriptTasks.cs | 2 +- .../umbraco/create/StylesheetTasks.cs | 2 +- .../umbraco/create/contentItemTasks.cs | 2 +- .../umbraco/create/contentItemTypeTasks.cs | 2 +- .../umbraco/create/contentTasks.cs | 2 +- .../umbraco/create/dictionaryTasks.cs | 2 +- .../umbraco/create/languageTasks.cs | 2 +- .../umbraco/create/macroTasks.cs | 2 +- .../umbraco/create/mediaTasks.cs | 2 +- .../umbraco/create/memberTasks.cs | 2 +- .../umbraco/create/nodetypeTasks.cs | 2 +- .../umbraco/create/script.ascx.cs | 2 +- .../umbraco/create/stylesheetPropertyTasks.cs | 2 +- .../umbraco/create/templateTasks.cs | 2 +- .../umbraco/create/userTasks.cs | 2 +- .../umbraco/dashboard.aspx.cs | 2 +- .../umbraco/dashboard/FeedProxy.aspx.cs | 2 +- .../umbraco/dashboard/LatestEdits.ascx.cs | 2 +- .../developer/DataTypes/editDatatype.aspx.cs | 2 +- .../Packages/BrowseRepository.aspx.cs | 2 +- .../developer/Packages/editPackage.aspx.cs | 4 +-- .../developer/Xslt/getXsltStatus.asmx.cs | 2 +- .../developer/Xslt/xsltVisualize.aspx.cs | 2 +- .../umbraco/dialogs/imageViewer.aspx.cs | 2 +- .../umbraco/dialogs/uploadImage.aspx.cs | 2 +- .../umbraco/login.aspx.cs | 2 +- .../masterpages/umbracoDialog.Master.cs | 3 +- .../umbraco/plugins/tinymce3/GzipModule.cs | 4 +-- .../settings/EditDictionaryItem.aspx.cs | 2 +- .../umbraco/settings/editTemplate.aspx.cs | 10 +++--- .../settings/scripts/editScript.aspx.cs | 2 +- .../umbraco/templateControls/ItemRenderer.cs | 2 +- .../umbraco/translation/default.aspx.cs | 2 +- .../umbraco/translation/xml.aspx.cs | 2 +- .../umbraco/umbraco.aspx.cs | 4 +-- .../umbraco/users/EditUser.aspx.cs | 2 +- .../umbraco/users/EditUserType.aspx.cs | 2 +- .../umbraco/users/PermissionEditor.aspx.cs | 2 +- .../umbraco/users/PermissionsHandler.asmx.cs | 2 +- .../umbracobase/baseHttpModule.cs | 7 +++-- .../umbracobase/restExtension.cs | 2 +- .../RazorCore/RazorMacroEngine.cs | 2 +- .../BasePages/ClientTools.cs | 2 +- src/umbraco.businesslogic/GlobalSettings.cs | 2 +- src/umbraco.businesslogic/Utils/TypeFinder.cs | 2 +- src/umbraco.businesslogic/xmlHelper.cs | 2 +- src/umbraco.cms/businesslogic/CMSNode.cs | 4 +-- .../businesslogic/CMSPreviewNode.cs | 2 +- .../businesslogic/Packager/Installer.cs | 10 +++--- .../PackageActions/addDashboardSection.cs | 2 +- .../PackageActions/addProxyFeedHost.cs | 2 +- .../PackageActions/addRestExtension.cs | 2 +- .../PackageActions/addXsltExtension.cs | 2 +- .../PackageInstance/CreatedPackage.cs | 6 ++-- .../PackageInstance/InstalledPackage.cs | 2 +- .../Packager/PackageInstance/utill.cs | 2 +- .../Packager/Repositories/Repository.cs | 2 +- .../businesslogic/Packager/Settings.cs | 2 +- .../businesslogic/Packager/data.cs | 13 ++++---- .../businesslogic/skinning/Skin.cs | 31 ++++++++++--------- .../skinning/tasks/AddStyleSheetToTemplate.cs | 10 +++--- .../businesslogic/skinning/tasks/ModifyCss.cs | 8 ++--- .../skinning/tasks/ModifyTemplate.cs | 6 ++-- .../businesslogic/translation/Translation.cs | 2 +- src/umbraco.cms/businesslogic/web/Access.cs | 2 +- .../businesslogic/web/DocumentVersionList.cs | 2 +- .../businesslogic/workflow/Notification.cs | 2 +- src/umbraco.controls/CodeArea.cs | 2 +- src/umbraco.controls/ProgressBar.cs | 3 +- src/umbraco.controls/Splitter.cs | 4 +-- .../TreePicker/BaseTreePicker.cs | 2 +- src/umbraco.controls/TreeUrlGenerator.cs | 6 ++-- .../SelectedItemsTemplate.cs | 2 +- src/umbraco.editorControls/XmlData.cs | 3 +- .../colorpicker/colorPicker.cs | 2 +- .../imagecropper/ImageInfo.cs | 2 +- .../macrocontainer/Editor.cs | 4 +-- .../relatedlinks/RelatedLinksDataEditor.cs | 2 +- .../simpleEditor/simpleEditor.cs | 8 ++--- .../tinyMCE3/TinyMCE.cs | 4 +-- .../tinyMCE3/webcontrol/plugin/GzipModule.cs | 2 +- .../tinymce/tinyMCEConfiguration.cs | 4 +-- .../ultimatePickerDataEditor.cs | 2 +- .../usercontrolPrevalueEditor.cs | 10 +++--- src/umbraco.macroRenderings/content.cs | 2 +- src/umbraco.macroRenderings/media.cs | 1 - 149 files changed, 245 insertions(+), 237 deletions(-) diff --git a/src/Umbraco.Tests/BusinessLogic/BaseTest.cs b/src/Umbraco.Tests/BusinessLogic/BaseTest.cs index 73d51e7816..50e6a43331 100644 --- a/src/Umbraco.Tests/BusinessLogic/BaseTest.cs +++ b/src/Umbraco.Tests/BusinessLogic/BaseTest.cs @@ -7,7 +7,7 @@ using Umbraco.Core; using Umbraco.Tests.TestHelpers; using umbraco.BusinessLogic; using umbraco.DataLayer; -using umbraco.IO; +using Umbraco.Core.IO; using GlobalSettings = umbraco.GlobalSettings; namespace Umbraco.Tests.BusinessLogic diff --git a/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs b/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs index d31e6dbec8..ea62370655 100644 --- a/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs +++ b/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs @@ -10,7 +10,7 @@ using Umbraco.Tests.TestHelpers; using Umbraco.Web; using Umbraco.Web.Routing; using umbraco.BusinessLogic; -using umbraco.IO; +using Umbraco.Core.IO; using umbraco.cms.businesslogic.cache; using umbraco.cms.businesslogic.template; diff --git a/src/Umbraco.Web.UI/install/steps/theend.ascx b/src/Umbraco.Web.UI/install/steps/theend.ascx index b2b4ffe395..ea0d00696c 100644 --- a/src/Umbraco.Web.UI/install/steps/theend.ascx +++ b/src/Umbraco.Web.UI/install/steps/theend.ascx @@ -31,8 +31,8 @@ jQuery(document).ready(function () {
If you installed a starter kit you can start by configuring your new site, just click "Preview your new website" and follow the instructions. Or to start adding content right away click "Set up your new website"

diff --git a/src/Umbraco.Web.UI/umbraco/Default.aspx b/src/Umbraco.Web.UI/umbraco/Default.aspx index 963ced80c2..d3421e3997 100644 --- a/src/Umbraco.Web.UI/umbraco/Default.aspx +++ b/src/Umbraco.Web.UI/umbraco/Default.aspx @@ -12,7 +12,7 @@ } - +