2010-10-04 61 views
4

我有一个多线程应用程序与(4)线程我想知道多少处理时间花在线程。我创建所有这些线程与线程池在.NET线程中花费了多少时间?

线程1做JOB1
线程2做作业2
..
..

结果将是:
线程1在12毫秒运行
线程2正在运行在20毫秒

我已经下载了一个网页在一个作业,每个工作正在处理在一个线程我想知道多少时间它需要一个网页下载(没有其他线程上下文切换的影响在计算时间内

回答

6

我发现在CodeProject此代码:

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

试试吧,报到;)

+0

您的回答正是我需要的,感谢,但是我在问题的底部阐述的问题正确吗? – Ehsan 2010-10-04 09:48:31

+0

您将获得加载网页的CPU时间,而不是网页加载时间。 (如果我正确地理解了这个问题) – 2010-10-04 10:01:47

-3

无法完成。问题是,除非你阻止它(很难做 - 没有多大意义),线程可以互相配合。所以,当它用THread2 20ms完成时,你不知道它有多少活动。

所谓的预先多任务的消极方面。

+3

-1:这当然是明显错误的。您可以从[Process.TotalProcessorTime](http://msdn.microsoft.com/en-us/library/system.diagnostics.processthread.totalprocessortime.aspx)获取与某个进程关联的用户时间,并从中获取所有线程[ProcessThread.TotalProcessorTime](http://msdn.microsoft.com/en-us/library/system.diagnostics.processthread.totalprocessortime.aspx)。这给你花时间执行代码。对于简单的“需要多长时间”,[Stopwatch](http://msdn.microsoft.com/zh-cn/library/system.diagnostics.stopwatch.aspx)就足够了。 – 2010-10-04 09:44:22

+0

我站好了。尼斯。 – TomTom 2010-10-04 09:46:57

5

如果你想获得的总时间,你会从一个秒表得到的,还有的Stopwatch类:

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

如果您想了解线程实际执行代码的时间(并且不等待I/O e通过枚举应用程序的Process对象的线程,您可以检查ProcessThread.TotalProcessorTime属性。

请注意,线程池中的线程在使用后不会被销毁,而是留在池中以供重用,这意味着线程的总时间包括它在当前工作负载之前完成的所有工作。

+0

那么有什么方法可以找出在等待IO的线程中花了多少时间? – Ehsan 2010-10-04 09:53:42

+0

那么,如果你的意思是“它始终没有执行代码”,唯一的方法就是用秒表测量它,并减去总处理器时间。请注意,通过添加代码来执行此操作,您将增加开销,尽可能小,并且如果您的线程执行得并不多,那么您的数字很小,开销可能会对您获得的计时产生重大影响出来了。你想要做什么? – 2010-10-04 09:55:16

+1

亲爱的Lasse,我的应用程序正在线程中下载很多wab页面,我想知道每个目标网站对我请求的响应时间(例如,我在12毫秒内从site1下载了page1),而没有其他线程的影响带宽下载他们的页面,是否清楚? – Ehsan 2010-10-04 09:59:35

2

WMI类Win32_Thared包含属性KernelModeTimeUserModeTime,如果有的话,会给你一个100ns的实际执行单元数。

但是,从documentation

如果该信息不可用,0(零)的值应该被使用。

所以这可能取决于操作系统(它肯定是在Win7上填充的)。

诸如此类的查询:select * from win32_thread where ProcessHandle="x"将获得进程ID为xWin32_Thread实例(忽略名称中的“句柄”)。例如,使用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 

(并确认这不是过去的时间,进程的开始时间是十六点44分五十秒2010-09-30。

+0

这是一件了不起的事情!但我认为这并不能解决我在@Lasse V Karlsen的评论中所陈述的问题 – Ehsan 2010-10-04 10:05:48