MVC mini profiler - шаг добавления вручную - PullRequest
3 голосов
/ 18 марта 2012

У меня много маленьких действий (10-30 на страницу), и они являются частью рекурсивного вызова, поэтому я не могу их легко считать одним шагом в профилировщике.Я получаю 30 коротких и четких счетчиков, когда мне нужно только общее количество.

Существует ли простой и прямой способ ручного добавления шага в мини-профилировщик?или заставить его суммировать шаги с тем же именем?

Кроме того, можно ли как-то поместить туда текстовую информацию, а не только время?

Ответы [ 2 ]

2 голосов
/ 28 октября 2014

Мне это тоже нужно было, поэтому я сделал эту маленькую вещь. Это работает довольно хорошо. Многие полезные свойства в 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 );
    }
}
0 голосов
/ 18 марта 2012

Вы хотите "обернуть" свои рекурсивные вызовы внутри оператора using. Примерно так:

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

«Шаг А» будет суммой ваших звонков. Внутри этого оператора используя вы можете делать все, что захотите. «Шаг А» может быть любой информацией, которую вы хотите. Вы можете поместить туда любое строковое значение, и оно появится в профилировщике. Вы также можете добавить простую текстовую информацию, просто делая «шаг» без использования.

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

Это просто вставит одну строку в окно вывода профилировщика. Я использовал это для того, чтобы выплевывать исключения или другую отладочную информацию.

...