![](/img/trans.png)
[英]What is the exact time taken by Application insight to Log the error
[英]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个测量值(由于未初始化_timePrevious
, result
第一个值将不准确),但可能更多。 您可以有一个动态列表来保持所有时间(这使结果最后最准确),或者例如具有移动位置的固定数组(通过第一次测量填充,然后通过新线程更新)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.