6

我想不时使用 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将那些s 留在那里并处理它们会导致多少开销?有没有办法告诉 MiniProfiler 我没有使用它,所以Step基本上什么都不做,但我仍然可以将它留在我的代码中?

4

1 回答 1

8

只要您的MiniProfiler实例为空(即您从不调用MiniProfiler.Start()),Step()扩展方法将返回空。此时唯一的开销是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 代码中的这个.StepHere()辅助方法Step(),这样就不必为每个调用命名!

于 2013-04-30T19:39:22.837 回答