记录线程所用的时间

时间:2014-01-29 07:59:44

标签: c# .net multithreading stopwatch

我有这段代码产生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代码(我已注释掉)添加到代码段但不确定这是否正确。有人能帮帮我吗?

2 个答案:

答案 0 :(得分:1)

如果您想要总时间,请在循环前启动秒表并在WaitAll后停止。

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

答案 1 :(得分:0)

有两种方法可以衡量平均时间:测量总时间并将其除以数字或线程或测量每个线程时间,将其相加并除以数字(但在这种情况下,您可以这样做称为移动平均值,它将在获得最后一个线程时间之前可用)。哪一个使用 - 取决于。

测量总时间

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次测量(由于未初始化result_timePrevious的第一个值将不准确,但可能更多。您可以使用动态列表来保存所有次(这使得结果最终结果最准确),或者,例如,具有移动位置的固定数组(由第一次测量填充,但随后更新)通过新线程)。