Как измерить производительность управляемого потока в .NET.

Я хочу измерить производительность управляемого (.NET) потока. Чтобы быть конкретным, мне нужно измерить следующее -

  • Как долго поток использует процессор?

  • Как долго он остается заблокированным (ожидая завершения удаленного вызова метода)?

Использование System.Diagnostic.StopWatch не помогает, потому что он читает функцию таймера производительности с высоким разрешением ОС/аппаратного обеспечения, которая может включать время, затрачиваемое на другие потоки, выполняемые параллельно и совместное использование одного и того же CPU.

Ответ 1

Вы можете использовать описанный здесь подход http://www.codeproject.com/KB/dotnet/ExecutionStopwatch.aspx который использует системную функцию GetThreadTimes http://msdn.microsoft.com/en-us/library/ms683237(v=vs.85).aspx

Время ожидания - это разница между общим временем и временем выполнения.

Добавлено: Мне нравится использовать одноразовый класс для измерения производительности - он сохраняет код чистым (например, жесткое кодирование консоли):

public class ThreadPerformance : IDisposable
{
    private Stopwatch _totalStopwatch = new Stopwatch();
    private ExecutionStopwatch _executionStopwatch = new ExecutionStopwatch();

    public static ThreadPerformance Measure()
    {
        return new ThreadPerformance();
    }

    private ThreadPerformance()
    {
        _totalStopwatch.Start();
        _executionStopwatch.Start();
    }

    public void Dispose()
    {
        _executionStopwatch.Stop();
        _totalStopwatch.Stop();
        Console.WriteLine("Performance mesurement for thread {0}", Thread.CurrentThread.ManagedThreadId);
        Console.WriteLine("Waiting: {0}", _totalStopwatch.Elapsed - _executionStopwatch.Elapsed);
        Console.WriteLine("CPU usage: {0}", _executionStopwatch.Elapsed);
    }
}

Использование очень просто:

static void ThreadProc()
{
    using (ThreadPerformance.Measure())
    {
        // do some calculations and waitings here
    }
}