Измерение времени выполнения в многопоточной среде

У меня есть приложение, которое использует объекты 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 () , но также время, в течение которого другие потоки выполняли свою работу в промежутке.

Есть ли простой способ точно узнать, сколько процессорного времени занял тот или иной метод, не считая времени выполнения из других потоков в результате механизмов разделения времени?

10
задан Kornelije Petak 12 December 2011 в 14:02
поделиться