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