Как измерить время выполнения блока кода (потока) с несколькими параллельными потоками в .NET - PullRequest
6 голосов
/ 17 декабря 2008

Прямо сейчас мы просто используем что-то вроде этого

        stopWatch.Start();            
        try
        {
            method();
        }
        finally
        {
            stopWatch.Stop();
        }

Что отлично работает для синхронных методов, но некоторые из них выполняются асинхронно, поэтому время при работе нескольких потоков искажается. Есть ли эквивалент System.Diagnostics.Stopwatch, который будет измерять только время, потраченное в текущем потоке?

Мы хотим собирать данные в течение длительного периода времени в нашей внутренней бета-версии (альфа?), И запуск под профилировщиком полный рабочий день невозможен.

Редактировать: Чтобы уточнить, мы хотим измерить только время, потраченное на выполнение метода (), поэтому, если Method1 () и Method2 () оба начинаются одновременно, а Method1 заканчивается на отметке 2 секунды, а Method2 заканчивается на отметке 4 Во-вторых, я хочу что-то, что скажет мне, что Method1 потратил около 1 секунды на выполнение, а Method2 потратил около 3 секунд на выполнение (Предполагая, что в течение первых 2 секунд они совместно использовали (предполагается, одноядерный) процессор.

Ответы [ 4 ]

2 голосов
/ 17 декабря 2008

Хм, ответ Джона Скита на этот вопрос:

Точная синхронизация строки кода в поточном приложении, C #

А также эта статья:

http://lyon -smith.org / блоги / код-о-Rama / Архив / 2007/07/17 / тайминг-кода на окнах-с-RDTSC-instruction.aspx

Кажется, что нет простого способа сделать это.

1 голос
/ 17 декабря 2008

Однажды я решил похожую проблему, создав оболочку для StopWatch, в которой экземпляр StopWatch помечен как ThreadStatic.

В качестве альтернативы есть инструменты, такие как Ants Profiler, которые вы можете приобрести, чтобы помочь вам.

1 голос
/ 17 декабря 2008

Секундомер должен измерять время, проведенное только в одном потоке. Вам нужно будет запустить отдельный экземпляр в каждом потоке. Это даст вам, вероятно, результаты закрытия к тому, что вы хотите.

В качестве альтернативы (предпочтительный вариант, если вы хотите отслеживать все приложение, а не только некоторые методы), есть различные счетчики производительности, которые вы можете использовать "из коробки" (они обновляются средой выполнения .Net). В интернете много информации, вы можете начать с msdn: http://msdn.microsoft.com/en-us/library/w8f5kw2e(VS.71).aspx

0 голосов
/ 16 октября 2009

Это крутой инструмент: http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx

...