我有这段代码产生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
代码(我已注释掉)添加到代码段但不确定这是否正确。有人能帮帮我吗?
答案 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
的第一个值将不准确,但可能更多。您可以使用动态列表来保存所有次(这使得结果最终结果最准确),或者,例如,具有移动位置的固定数组(由第一次测量填充,但随后更新)通过新线程)。