我需要计算执行每个线程所需的时间。 所以我用这个代码来做。
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds,ts.Milliseconds);
Console.WriteLine(elapsedTime, "RunTime");
现在我的每个线程都执行一个方法work(),它就是这样的:
void work(){
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
//codes,,,
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds,ts.Milliseconds);
Console.WriteLine(elapsedTime, "RunTime");
}
所以现在我的问题是我是否需要创建1000个秒表对象的数组,因为1000个work()方法同时运行。
答案 0 :(得分:2)
您的代码将正常工作,假设每个调用都在不同的线程上完成,因为您为每个线程创建一个新的StopWatch
对象。
也就是说,每个StopWatch
都不是共享资源,因此不同的线程不应该干扰其他线程StopWatch
对象。
答案 1 :(得分:1)
如果每个work()方法都在自己的线程中生成,那么是。
另外,除非你有一个非常大的服务器场,否则你可能不应该实例化1000个线程。
答案 2 :(得分:1)
请注意,StopWatch会测量“Wall Time”,即在Start
和Stop
之间经过“现实生活”的时间。当您有多个并发运行的线程时,时间将包括线程未执行但必须等待CPU内核可用的时间。
GetThreadTimes可以测量在线程中花费的时间,但它也不是完美的:它具有非常粗糙的粒度(10..15ms),这使得它不适合小规模的性能测量,并且给出了早期自愿放弃量子的线程的结果不正确。
答案 3 :(得分:0)
您的stopWatch
变量是work
方法中的本地变量。这意味着每次调用work
时都会有一个自变量...哎呀,您甚至可以在 work
内调用work
(同样线程)并获得独立的StopWatch
个实例和stopWatch
个变量。