我想不时使用MiniProfiler来分析我的代码,但我不想分支并继续重新引入它;我想把它留在那里,当我不使用它时,从我的布局模板中删除@ MiniProfiler.RenderIncludes()调用.但是,我的代码仍然如下所
using (MiniProfiler.Current.Step("Generate events index view model")) { _thisStep = MiniProfiler.Current.Step("Check query string"); int pageIndex = 0; // Do check... _thisStep.Dispose(); // Do other stuff... }
将这些步骤留在那里并处置它们会产生多少开销?有没有办法告诉MiniProfiler我没有使用它,以便Step基本上什么都不做,但我仍然可以把它留在我的代码中?
只要您的MiniProfiler实例为null(即您从不调用MiniProfiler.Start()),Step()扩展方法将返回null.此时唯一的开销是using语句,它可以忽略不计.可以将其视为必须执行的额外if(false)语句.我会建议您使用在使用块之外存储IDispoable的语法,因为您没有在.Dispose()调用上获得自动空值检查,例如
_thisStep = MiniProfiler.Current.Step("Check query string"); // if you do it this way, you will have to manually check for null every time if (_thisStep != null) { _thisStep.Dispose(); }
我通常的工作方式是每个方法只配置一次 – 如果我需要另一个步骤,我必须将代码提取到另一个方法,例如
public EventsIndexViewModel GetViewModel() { using (MiniProfiler.Current.Step("Generate events index view model")) { var pageIndex = GetPageIndex(); } } private int GetPageIndex() { using (MiniProfiler.Current.Step("GetPageIndex")) { // Do check... return result... } }
这有一个额外的好处,保持我的方法小:)
如果您使用的是.NET 4.5,则可以利用CallerFilePathAttribute
并使用我在Stack Overflow代码中输入的this .StepHere()
helper method,这样就不必为每个Step()调用命名!