2011-01-20 3 views
10

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

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

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

Использование System.Diagnostic.StopWatch не полезно, becuase читает высокого разрешения таймеры производительности особенность OS/Метизы, которая может включать в себя время, затраченное другими потоками, работающих параллельно и делясь тот же процессор.

ответ

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

Спасибо lazyberezovsky. Я думал об этом же. Я не уверен, будет ли это решение работать без проблем на разных платформах ОС/версиях .NET/аппаратных платформах. Документация Microsoft не дает никаких гарантий, что управляемый поток .NET всегда будет отображаться в один и тот же неуправляемый поток. Что делать, если GetCurrentThread() возвращает разные дескрипторы потоков в двух отдельных вызовах? – Nitin

Смежные вопросы