2015-04-01 61 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/