2012-03-18 100 views
3

我有很多小動作(每頁10-30個),它們是遞歸調用的一部分,所以我不能輕易將它們計爲探查器中的單個步驟。當我只需要總數時,我會得到30個不同的櫃檯。MVC mini profiler - 手動添加步驟

是否有一種簡單直接的方式將手動步驟添加到迷你分析器?或者讓它總結具有相同名稱的步驟?

此外,是否有可能以某種方式在那裏放置文本信息,而不僅僅是計時?

回答

0

你想在using語句中「包裹」你的遞歸調用。類似這樣的:

using (profiler.Step("Step A")) 
    { 
     // something recursive here 
     Thread.Sleep(100); 
    } 

「步驟A」將是您的呼叫總數。在使用聲明中,你可以做任何你想做的事情。 「步驟A」可以是任何你想要的信息。你可以把任何字符串值放在那裏,它會顯示在分析器中。您也可以在不使用的情況下僅通過「步驟」添加簡單的文本信息。

MiniProfiler.Current.Step("Some code after this"); 

這將只需插入一行到分析器輸出窗口。我用它來吐出異常或其他調試信息。

+0

我不想包裝整個事情,我只是想測量遞歸方法內的特定代碼運行需要多長時間。我想我可以自己測量一下,然後在步驟名稱中添加一個步驟,但隨後它將始終處於平凡的部分,具有不正確的計時等等。我希望有一個乾淨的方法可以做它 – Madd0g 2012-03-18 12:59:07

+0

今天我玩了這一點,我找不到乾淨的方式去做你想做的事。您可以手動設置兒童的時間持續時間,但它會嵌套層次結構和實際持續時間。基於我的測試,它會出現在「微不足道」的部分,無論如何因爲它出現的時間是負的。我建議您在此處將其作爲功能請求提交:http://code.google.com/p/mvc-mini-profiler/issues/list – 2012-03-19 14:00:54

2

我也需要這個,所以我做了這個小東西。它工作得很好。 MiniProfiler中很多有用的屬性都是內部的或類似的,所以有些代碼是從MiniProfiler源複製的。還要注意,因爲它是用於內循環的,所以它不會舍入到1/10毫秒。

public class GroupTiming : IDisposable 
{ 
    private Timing _timing; 
    private MiniProfiler _profiler; 
    private readonly Stopwatch _sw; 

    public GroupTiming(MiniProfiler profiler, Timing timing) 
    { 
     _timing = timing; 
     _profiler = profiler; 
     _profiler.Head = _timing; 
     _sw = new Stopwatch(); 
     _sw.Start(); 
    } 

    public void Dispose() 
    { 
     _timing.DurationMilliseconds += (decimal)(1000*_sw.ElapsedTicks)/(decimal)Stopwatch.Frequency; 
     _profiler.Head = _timing.ParentTiming; 
    } 
} 

public static class MiniProfilerExtensions 
{ 
    public static IDisposable StepGroup(this MiniProfiler profiler, string name) 
    { 
     return profiler == null ? null : profiler.StepGroupImpl(name); 
    } 

    private static IDisposable StepGroupImpl(this MiniProfiler profiler, string name) 
    { 
     Timing timing = null; 

     if(profiler.Head.Children != null) 
     { 
      timing = profiler.Head.Children.SingleOrDefault(_ => _.Name == name); 
     } 

     if(timing == null) 
     { 
      using(timing = new Timing(profiler, profiler.Head, name)) { } 
     } 

     return new GroupTiming(profiler, timing); 
    } 
} 
相關問題