我有一段代码,它生成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();我希望记录每个线程执行所需的时间,并将其记录到数据库中。我在谷歌上读了很多建议使用Stopwatch的文章。我尝试将Stopwatch代码(我已经注释掉)添加到代码片段中,但不确定这是否正确。有人能帮帮我吗?
发布于 2014-01-29 08:12:26
如果您想要总时间,在循环之前启动秒表,在WaitAll之后停止秒表。
如果您需要为每个线程单独测量,则为循环中的每个线程创建一个单独的秒表。将sw.Start()放在委托的开头,sw.Stop()放在委托的末尾。将秒表放在列表中(就像您对EventWaitHandle所做的那样),并在代码末尾读取TimeElapsed值。
发布于 2014-01-29 09:04:58
测量平均时间有两种可能性:测量总时间并将其除以一个或多个线程,或度量每个线程时间,将其加和并除以数字(但在这种情况下,您可以使用所谓的移动平均,在获得最后一个线程时间之前就可用了)。哪一种-看情况而定。
测量总时间
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在这里,我们只使用两个度量(由于未初始化的result,result的第一个值将是不准确的),但它可能更多。您可以有一个动态列表来保存所有时间(这使得结果在结尾时最准确),或者,例如,固定的具有移动位置的数组(通过第一次测量来填充,然后由新线程更新)。
https://stackoverflow.com/questions/21425254
复制相似问题