我想不时使用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...
}
将Step
留在那里并处置它们会产生多少开销?有没有办法告诉MiniProfiler我没有使用它,以便Step
基本上什么都不做,但我仍然可以把它留在我的代码中?
答案 0 :(得分:8)
只要您的MiniProfiler
实例为空(即您永远不会调用MiniProfiler.Start()
),Step()
扩展方法将返回null。此时唯一的开销是using
语句,这可以忽略不计。可以将其视为必须执行的额外if (false)
语句。
我建议您在IDispoable
块之外存储using
时使用的语法,因为您没有对.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()
调用命名!