在.NET线程中花了多少时间?
我有一个带有(4)线程的multithreading应用程序我想知道在线程中花费了多少处理时间。 我用ThreadPool创建了所有这些线程
Thread1做job1
Thread2做job2
..
..
结果将是:
Thread1在12毫秒内运行
Thread2在20毫秒内运行
我实际上是在一个作业中下载一个网页,每个作业在一个线程中处理我想知道网页下载需要多少时间(没有其他线程上下文切换对计算时间的影响)
如果你想获得秒表的总时间,那就是秒表类:
Stopwatch sw = Stopwatch.StartNew(); // execute code sw.Stop(); // read and report on sw.ElapsedMilliseconds
如果要查找线程实际执行代码的时间(而不是等待I / O等),可以通过枚举应用程序的Process对象的线程来检查ProcessThread.TotalProcessorTime属性。
请注意,线程池中的线程在使用后不会被销毁,而是留在池中以便重用,这意味着线程的总时间包括它在当前工作负载之前完成的所有操作。
WMI类Win32_Thared
包含属性KernelModeTime
和UserModeTime
,如果可用,它将为您提供100ns实际执行单位的计数。
但是,从文档 :
如果此信息不可用,则应使用值0(零)。
因此,这可能取决于操作系统(在Win7上肯定会填充)。
查询如: select * from win32_thread where ProcessHandle="x"
将获取进程id x
的Win32_Thread
实例(忽略名称中的“handle”)。 例如,使用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
(并确认这不是经过的时间,过程开始时间是2010-09-30 16:44:50。
无法做到。 问题是,除非你阻止它(很难做到 – 没什么意义)线程可以被智能化。 因此,虽然它要完成THread2 20ms,但你不知道它有多少是活跃的。
什么叫做preemtive多任务处理的消极方面。