У меня есть приложение, которое использует Task
(TPL) объекты для асинхронного выполнения.
Основной поток ожидает триггер (некоторый пакет TCP), а затем выполняет несколько задач.Что я хочу сделать, это измерить время, затраченное на выполнение задач.
Посмотрите на код.У меня есть длительная операция (Generator
), заключенная в Stopwatch's
start / stop.
Task.Factory.StartNew((t) => {
Stopwatch sw = new Stopwatch();
sw.Start();
Generator g = new Generator();
g.GenerateIntervals(); // lengthy operation
sw.Stop();
GlobalStopwatch.Add(sw.Elapsed);
});
Вот проблема.Секундомер использует DateTime.UtcNow.Ticks
в момент Start()
, а затем снова в момент Stop()
.Затем он вычитает эти два, чтобы получить истекшее время.
Дело в том, что какой-то другой поток (в однопоточной системе) может получить некоторое время процессора, пока Generator
(из кода) выполняет егоGenerateIntervals()
длительная операция.Это означает, что прошедшее время, записанное секундомером, будет содержать не только Generaor.GenerateIntervals()
время, но и время, в течение которого другие потоки выполняли свою работу.
Есть ли простой способ точно узнать, сколько извремя процессора заняло какой-то метод, не считая времени выполнения из других потоков в результате механизмов разделения времени?