关于线程的一些概念问题

时间:2010-07-03 07:33:31

标签: c# .net multithreading

我需要计算执行每个线程所需的时间。 所以我用这个代码来做。

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()方法同时运行。

4 个答案:

答案 0 :(得分:2)

您的代码将正常工作,假设每个调用都在不同的线程上完成,因为您为每个线程创建一个新的StopWatch对象。

也就是说,每个StopWatch都不是共享资源,因此不同的线程不应该干扰其他线程StopWatch对象。

答案 1 :(得分:1)

如果每个work()方法都在自己的线程中生成,那么是。

另外,除非你有一个非常大的服务器场,否则你可能不应该实例化1000个线程。

答案 2 :(得分:1)

请注意,StopWatch会测量“Wall Time”,即在StartStop之间经过“现实生活”的时间。当您有多个并发运行的线程时,时间将包括线程未执行但必须等待CPU内核可用的时间。

GetThreadTimes可以测量在线程中花费的时间,但它也不是完美的:它具有非常粗糙的粒度(10..15ms),这使得它不适合小规模的性能测量,并且给出了早期自愿放弃量子的线程的结果不正确。

答案 3 :(得分:0)

您的stopWatch变量是work方法中的本地变量。这意味着每次调用work时都会有一个自变量...哎呀,您甚至可以在 work内调用work (同样线程)并获得独立的StopWatch个实例和stopWatch个变量。