У меня есть приложение, которое использует объекты Task
(TPL) для асинхронного выполнения.
Основной поток ожидает триггера (некоторого TCP-пакета), а затем выполняет несколько задач. Я хочу измерить время, потраченное на выполнение задач.
Взгляните на код. У меня есть длительная операция ( Генератор
), заключенная в Секундомер
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 ()
. Затем он вычитает эти два, чтобы получить затраченное время.
Дело в том, что какой-то другой поток (в однопоточной системе) может получить некоторое время процессора, в то время как Генератор
(из кода) выполняет свои GenerateInterval ()
долго операция. Это означает, что прошедшее время, зарегистрированное секундомером, будет содержать не только время Generaor.GenerateIntervals ()
, но также время, в течение которого другие потоки выполняли свою работу в промежутке.
Есть ли простой способ точно узнать, сколько процессорного времени занял тот или иной метод, не считая времени выполнения из других потоков в результате механизмов разделения времени?