Сколько времени проведено в .NET Thread? - PullRequest
6 голосов
/ 04 октября 2010

У меня есть многопоточное приложение с (4) потоком, я хочу знать, сколько времени обработки тратится в потоках.Я создал все эти темы с ThreadPool

Thread1 делает job1Thread2 делает работу2....

результат будет:Thread1 был запущен за 12 миллисекундThread2 был запущен за 20 миллисекунд

Я на самом деле загружаю веб-страницу в задании, которое обрабатывает каждое задание в одном потоке. Я хочу знать, сколько времени занимает загрузка веб-страницы (без влияния контекста других потоковпереключиться в расчетное время

Ответы [ 4 ]

7 голосов
/ 04 октября 2010

Я нашел этот код в codeproject:

http://www.codeproject.com/KB/dotnet/ExecutionStopwatch.aspx

Попробуйте и сообщите;)

5 голосов
/ 04 октября 2010

Если вы хотите узнать общее время, которое вы получите от секундомера, есть класс Секундомер :

Stopwatch sw = Stopwatch.StartNew();
// execute code
sw.Stop();
// read and report on sw.ElapsedMilliseconds

Если вы хотите узнать, сколько времени поток фактически выполнял код (и не ожидал ввода-вывода и т. Д.), Вы можете проверить свойство ProcessThread.TotalProcessorTime , перечислив потоки Обработка объекта для вашего приложения.

Обратите внимание, что потоки в пуле потоков не уничтожаются после использования, но остаются в пуле для повторного использования, что означает, что ваше общее время для потока включает в себя все, что он сделал до текущей рабочей нагрузки.

2 голосов
/ 04 октября 2010

класс WMI Win32_Thared содержит свойства KernelModeTime и UserModeTime, которые, если они доступны, подсчитывают 100 нс единиц фактического выполнения.

Но из документации :

Если эта информация недоступна, следует использовать значение 0 (ноль).

Таким образом, это может зависеть от ОС (оно обязательно заполняется здесь на Win7).

Запрос типа: select * from win32_thread where ProcessHandle="x" получит Win32_Thread экземпляров для идентификатора процесса x (игнорировать «дескриптор» в названии).Например, используя PowerShell, он просматривает собственные потоки:

PS[64bit] > gwmi -Query "select * from win32_thread where ProcessHandle=""7064"""|
ft -AutoSize Handle,KernelModeTime,UserModeTime

Handle KernelModeTime UserModeTime
------ -------------- ------------
5548              218          312
6620                0            0
6112                0            0
7148                0           15
6888                0            0
7380                0            0
3992                0            0
8372                0            0
644                 0            0
1328                0           15

(И чтобы подтвердить, что это не истекшее время, время запуска процесса равно 16:44:50 2010-09-30.

0 голосов
/ 04 октября 2010

Не может быть сделано. Проблема в том, что если вы не заблокируете его (что трудно сделать, имеет мало смысла), потоки могут быть заинтервированы. Таким образом, хотя для его завершения требуется 20 мс, вы не знаете, сколько из этого было активно.

Негативная сторона того, что называется многозадачностью перед вытеснением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...