2011-12-06 110 views
4

我已经编写了一个依赖于线程的程序。此外,还需要测量每个线程所花费的总时间,以及执行时间(内核时间加上用户时间)。线程执行时序

可以有任意数量的线程,许多线程可以一次运行。这归功于用户活动。我需要它们尽可能快地运行,所以使用像WMI/Performance Monitor那样的一些开销来测量线程时间并不理想。

目前,我使用GetThreadTimes,如本文所示:http://www.codeproject.com/KB/dotnet/ExecutionStopwatch.aspx

我的问题很简单:我理解.NET线程可能不是一比一的基础与系统线程上对应(尽管到目前为止我的测试中,似乎是一对一的)。既然如此,如果.NET决定将两个或更多的线程放到一个系统线程中,我会从我的计时代码中得到奇怪的结果吗?如果是这样(或者甚至没有),是否有另一种方法来测量.NET线程的内核和用户时间?

+3

就我个人而言,我会选择像[SmartThreadPool](http://www.codeproject.com/KB/threads/smartthreadpool.aspx)这样的线程池,并使用它们的性能计数器来衡量事物。 –

+0

我很难理解你的问题,而不是你真正想要衡量的是什么,为什么。您是否考虑过使用秒表类型+日志记录进行简单的计时或任何常规CPU分析器,例如ANTS或Jetbrain? – Mahol25

回答

1

如其所述:多线程由线程调度程序内部管理,CLR通常委托给操作系统。线程调度程序确保所有活动线程都分配了适当的执行时间,并且正在等待或阻止的线程(例如,在排它锁或用户输入上)不占用CPU时间。理论上NET团队可能会实现他们自己的调度程序,但我怀疑这一点。所以我认为GetThreadTimes函数是您需要的。