2015-04-01 60 views
-1

您好我想測量我的代碼中的函數的運行時間。我使用threadpool來運行該功能。在c#.NET4.0中的線程池的運行時間

System.Diagnostics.Stopwatch w = new System.Diagnostics.Stopwatch(); 
     w.Start(); 
     ThreadPool.QueueUserWorkItem(new WaitCallback(f)); 
     w.Stop(); 
     label1.Text = w.Elapsed.ToString(); 

f(){ //array.sort()} 

f()對一些數字進行排序。

例如:對於60000000的數字秒錶顯示:帶有線程池00:00:00.0003201但性能不帶線程00:00:06.8651903 ???

對於具有線程池00:00:00.0001801的1000個號碼,並且不用它00:00:00.0011956 ???

現在我有一些問題嗎?

1.是否可以減少運行時間或者我犯了一個錯誤?

2.可以秒錶測量同時運行的函數的運行時間嗎?

+0

你爲什麼要測量的時間才能讓線程池最終做某事的金額是多少? – SLaks 2015-04-01 02:31:32

+1

_「我想測量一個函數在我的代碼中的運行時間」_ - 你所做的只是測量通過ThreadPool.QueueUserWorkItem()** ** **一個項目所需的時間**而不是**運行'f()'需要多長時間 – MickyD 2015-04-01 02:34:25

回答

2

1.可以減少運行時間或者我犯了一個錯誤?

怕你犯了一個錯誤。 QueueUserWorkItem立即返回,允許當前線程在另一個線程上完成工作時繼續。因此在工作開始後立即調用w.Stop();。它不會等待工作項目完成。因此,您有效地衡量了將項目添加到隊列需要多長時間,而不是實際完成工作需要多長時間。

2.could stopwatch測量同時運行的函數的運行時間嗎?

您可以在函數內部啓動/停止監視,或者擁有代表函數的代理函數。這個委託可以用start/stop調用包裝實際的功能/工作,並把結果時間發送到需要記錄的地方。

1

使用TreadPool,由於您不等待線程結束,因此已用時間只是排隊工作項的時間(而不是執行時間)。

對於第一個問題,您可以使用多線程提高性能,但在您的代碼示例中,它幾乎沒有改變。

對於你的第二個問題,沒有,但也許這NuGet包將幫助您:https://www.nuget.org/packages/MethodTimer.Fody/