繁体   English   中英

记录线程花费的时间

[英]Log the time taken by a Thread

我有一段代码,它产生6个线程并在每个线程上同时执行GetAverage方法。

 var threadFinishEvents = new List<EventWaitHandle>();
 //StopWatch sw = new StopWatch();
 for (int i = 0; i < 6; i++)
 {
      var threadFinish = new EventWaitHandle(false, EventResetMode.ManualReset);
      threadFinishEvents.Add(threadFinish);
      var thread = new Thread(delegate()
                            {
                                GetAverage(userName);
                                threadFinish.Set();
                                //sw.Stop();
                            });
              //sw.Start();
              thread.Start();
 }
 Mutex.WaitAll(threadFinishEvents.ToArray(), threadTimeout);
 long timeElapsed = sw.TimeElapsed();

我想记录每个线程执行的时间并将其记录到数据库中。 我在Google上阅读了很多建议使用Stopwatch的帖子。 我尝试将Stopwatch代码(已注释掉)添加到代码段中,但不确定是否正确。 有人能帮助我吗?

如果需要总时间 ,请在循环之前启动秒表,在WaitAll之后停止它。

如果您需要为每个线程单独测量,请为循环内的每个线程创建单独的秒表。 sw.Start()放在代表的开头,并将sw.Stop()放在代表的结尾。 将秒表放在一个列表中(就像使用TimeElapsed ),并在代码末尾读取TimeElapsed值。

有两种方法可以测量平均时间 :测量总时间,然后将其除以数字或线程数,或者测量每个线程时间,将其相加并除以数字(但是在这种情况下,您可以使用所谓的移动平均数 ,该方法将在最后一次之前可用)获得线程时间)。 使用哪个-取决于。

测量总时间

var watch = new StopWatch();
watch.Start();
// .. whole job, creating N threads, waiting for all of them to finish
watch.Stop();
var result = watch.Elapsed / N;

它将包括开销(循环时间,创建线程,执行第一个线程等),但是您运行的线程越多,它将变得越来越准确。

测量每个线程的时间

//  inside each thread
var watch = new StopWatch();
watch.Start();
// ... thread job
watch.Stop();
timeX = watch.Elapsed;

// after job is done
Mutex.Wait...
result = (time1 + time2 + ... ) / N;

您不包括任何开销,最准确的结果。 但是您必须保留所有timeX

移动平均时间

//  inside each thread
var watch = new StopWatch();
watch.Start();
// ... thread job
watch.Stop();
result = (_timePrevious + watch.Elapsed) / 2;
_timePrevious = watch.Elapsed;

// after job done
result = result; // total result is the same as the most recent

在这里,我们仅使用2个测量值(由于未初始化_timePreviousresult第一个值将不准确),但可能更多。 您可以有一个动态列表来保持所有时间(这使结果最后最准确),或者例如具有移动位置的固定数组(通过第一次测量填充,然后通过新线程更新)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM