2010-10-04 62 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