如何衡量.NET中托管线程的性能

时间:2011-01-20 10:30:53

标签: c# .net performance clr

我想测量托管(.NET)线程的性能。具体来说,我需要衡量以下内容 -

  1. 线程使用CPU多长时间?

  2. 它被阻止多长时间(等待远程方法调用完成)?

  3. 使用System.Diagnostic.StopWatch没有帮助,因为它读取了操作系统/硬件的高分辨率性能计时器功能,其中可能包括并行运行的其他线程和共享同一CPU所消耗的时间。

2 个答案:

答案 0 :(得分:4)

您可以使用此处描述的方法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
    }
}

答案 1 :(得分:0)

Managed Stack Explorer是否有帮助。